Použití konstruktorů (Průvodce programováním v C#)
Při vytvoření instance třídy nebo struktury je jeho konstruktor volán. 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 třída s názvem Taxi
definována pomocí jednoduchého konstruktoru. Tato třída je poté instancována pomocí nového operátoru . Konstruktor Taxi
je vyvolán operátorem new
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 vytváření instance objektu pomocí operátoru new
a nejsou k dispozici žádné argumenty pro new
. 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 části Konstruktory instance.
Pokud není třída statická, kompilátor jazyka C# poskytuje třídám bez konstruktorů veřejný konstruktor bez parametrů, aby umožnil vytvoření instance 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 typů struktury se podobají konstruktorům tříd. Při vytvoření instance typu struktury s new
je vyvolán konstruktor. Pokud je struct
nastavena na hodnotu default
, modul runtime inicializuje veškerou paměť ve struktuře na hodnotu 0. Pokud deklarujete inicializátory polí v struct
typu, je nutné zadat konstruktor bez parametrů. Další informace naleznete v části Inicializace struktury a výchozí hodnoty části Typy struktury článku.
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 nepoužívá new
a protože se pokouší 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ány prostřednictvím příkazu new
nebo základního příkazu . Třídy a struktury mohou také definovat více konstruktorů, a ani jeden z nich není nutný k definování konstruktoru bez parametrů. Napří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 klíčové slovo base
k volání konstruktoru základní třídy. Napří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án předtím, než je spuštěn blok pro konstruktor. Klíčové slovo base
lze použít s nebo bez parametrů. Jakékoli parametry konstruktoru lze použít jako parametry pro base
nebo jako součást výrazu. Další informace naleznete v nadpisu .
Pokud v odvozené třídě není konstruktor základní třídy volán explicitně pomocí klíčového slova base
, je konstruktor bez parametrů, pokud existuje, implicitně volán. 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í explicitně volat základní konstruktor pomocí base
.
Konstruktor může vyvolat jiný konstruktor ve stejném objektu pomocí klíčového slova this. Stejně jako base
lze this
použít s parametry nebo bez parametrů a všechny parametry v konstruktoru jsou k dispozici jako parametry pro 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 slova this
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é, privátní, chráněné, interní, chráněné interní nebo privátní chráněné. Tyto modifikátory přístupu definují, jak mohou uživatelé třídy sestavit třídu. Další informace najdete v tématu Modifikátory přístupu.
Konstruktor lze deklarovat staticky pomocí klíčového slova static. 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