Použití konstruktorů (průvodce programováním v C#)
Při vytvoření instance třídy třídy nebo struktury volá modul runtime 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 třída s názvem Taxi
definována pomocí jednoduchého konstruktoru. Tato třída je pak instancována pomocí operátoru new
. Modul runtime vyvolá konstruktor Taxi
ihned po přidělení paměti pro nový objekt.
public class Taxi
{
private string taxiTag;
public Taxi(string tag) => taxiTag = tag;
public override string ToString() => $"Taxi: {taxiTag}";
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi("Tag1345");
Console.WriteLine(t);
}
}
Konstruktor, který nepřijímá žádné parametry, se nazývá konstruktor bez parametrů. Modul runtime vyvolá konstruktor bez parametrů při vytvoření instance objektu pomocí operátoru new
a nejsou k dispozici žádné argumenty pro new
. C# 12 zavedl 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
modul runtime vyvolá 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ý není inicializován:
int i;
Console.WriteLine(i);
Alternativně je možné některé typy struct
(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 dříve, než se začne provádět 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 je zavolán následující konstruktor.
public Employee(int annualSalary) => Salary = annualSalary;
Konstruktory lze označit jako public
, private
, protected
, interní, chráněné interní nebo private protected
. 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 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