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 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 newje 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á newa 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 basenebo 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 baselze this použít s parametry nebo bez parametrů a všechny parametry v konstruktoru jsou k dispozici jako parametry pro thisnebo 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 Konstruktory instance a Statické konstruktory vespecifikaci jazyka C# . Specifikace jazyka je konečným zdrojem syntaxe a použití jazyka C#.

Viz také