Sdílet prostřednictvím


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 newtypu 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 basenebo 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#.

Viz také