Použití konstruktorů (Průvodce programováním v C#)
Při vytvoření instance třídy nebo struktury je volána jeho konstruktor. Konstruktory mají stejný název jako třída nebo struktura a obvykle inicializují datové členy nového objektu.
V následujícím příkladu je pojmenovaná Taxi
třída definována pomocí jednoduchého konstruktoru. Tato třída se pak vytvoří instance s novým operátorem. Konstruktor Taxi
je vyvolán new
operátorem ihned po přidělení paměti pro nový objekt.
public class Taxi
{
public bool IsInitialized;
public Taxi()
{
IsInitialized = true;
}
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi();
Console.WriteLine(t.IsInitialized);
}
}
Konstruktor, který nepřijímá žádné parametry, se nazývá konstruktor bez parametrů. Konstruktory bez parametrů jsou vyvolány při každé instanci objektu pomocí operátoru new
a nejsou k dispozici new
žádné argumenty . C# 12 zavádí primární konstruktory. Primární konstruktor určuje parametry, které musí být poskytnuty pro inicializaci nového objektu. Další informace naleznete v tématu Konstruktory instance.
Není-li třída statická, třídy bez konstruktorů mají veřejný konstruktor bez parametrů kompilátorem jazyka C#, aby bylo možné povolit vytváření instancí třídy. Další informace naleznete v tématu Statické třídy a členy statické třídy.
Vytvořením soukromého konstruktoru můžete zabránit vytvoření instance třídy následujícím způsobem:
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = Math.E; //2.71828...
}
Další informace naleznete v tématu Privátní konstruktory.
Konstruktory pro typy struktur se podobají konstruktorům tříd. Při vytvoření instance new
typu struktury pomocí konstruktoru je vyvolán. Pokud je nastavena struct
na hodnotu default
, modul runtime inicializuje veškerou paměť ve struktuře na 0. Před jazykem C# 10 nemůže obsahovat explicitní konstruktor bez parametrů, structs
protože ho kompilátor poskytuje automaticky. Další informace naleznete v části Inicializace struktury a výchozí hodnoty v článku Typy struktur.
Následující kód používá konstruktor bez parametrů pro Int32, takže máte jistotu, že celé číslo je inicializováno:
int i = new int();
Console.WriteLine(i);
Následující kód však způsobí chybu kompilátoru, protože se nepoužívá new
, a protože se pokusí použít objekt, který nebyl inicializován:
int i;
Console.WriteLine(i);
Alternativně lze objekty založené na structs
(včetně všech předdefinovaných číselných typů) inicializovat nebo přiřadit a pak je použít jako v následujícím příkladu:
int a = 44; // Initialize the value type...
int b;
b = 33; // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);
Třídy i struktury mohou definovat konstruktory, které přebírají parametry, včetně primárních konstruktorů. Konstruktory, které přebírají parametry, musí být volána příkazem new
nebo základním příkazem. Třídy a struktury mohou také definovat více konstruktorů, a ani jeden z nich není nutný k definování konstruktoru bez parametrů. Příklad:
public class Employee
{
public int Salary;
public Employee() { }
public Employee(int annualSalary)
{
Salary = annualSalary;
}
public Employee(int weeklySalary, int numberOfWeeks)
{
Salary = weeklySalary * numberOfWeeks;
}
}
Tuto třídu lze vytvořit pomocí některého z následujících příkazů:
Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);
Konstruktor může použít base
klíčové slovo k volání konstruktoru základní třídy. Příklad:
public class Manager : Employee
{
public Manager(int annualSalary)
: base(annualSalary)
{
//Add further instructions here.
}
}
V tomto příkladu je konstruktor základní třídy volána před spuštěním bloku pro konstruktor. Klíčové base
slovo lze použít s parametry nebo bez. Jakékoli parametry konstruktoru lze použít jako parametry pro base
nebo jako součást výrazu. Další informace najdete v základu.
Pokud v odvozené třídě není konstruktor základní třídy volána explicitně pomocí klíčového base
slova, konstruktor bez parametrů, pokud existuje, je volána implicitně. Následující deklarace konstruktoru jsou v podstatě stejné:
public Manager(int initialData)
{
//Add further instructions here.
}
public Manager(int initialData)
: base()
{
//Add further instructions here.
}
Pokud základní třída nenabízí konstruktor bez parametrů, odvozená třída musí provést explicitní volání základní konstruktor pomocí base
.
Konstruktor může vyvolat jiný konstruktor ve stejném objektu pomocí tohoto klíčového slova. Podobně jako base
, this
lze použít s parametry nebo bez parametrů a všechny parametry v konstruktoru jsou k dispozici jako parametry this
, nebo jako součást výrazu. Například druhý konstruktor v předchozím příkladu lze přepsat pomocí this
:
public Employee(int weeklySalary, int numberOfWeeks)
: this(weeklySalary * numberOfWeeks)
{
}
Použití klíčového this
slova v předchozím příkladu způsobí, že tento konstruktor bude volána:
public Employee(int annualSalary)
{
Salary = annualSalary;
}
Konstruktory lze označit jako veřejné, soukromé, chráněné, interní, chráněné interní nebo soukromé. Tyto modifikátory přístupu definují, jak mohou uživatelé třídy sestavit třídu. Další informace naleznete v tématu Modifikátory accessu.
Konstruktor lze deklarovat staticky pomocí statického klíčového slova. Statické konstruktory se volají automaticky, bezprostředně před přístupem ke statickým polím a slouží k inicializaci členů statické třídy. Další informace naleznete v tématu Statické konstruktory.
Specifikace jazyka C#
Další informace naleznete v tématu Konstruktory instancí a statické konstruktory ve specifikaci jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.