Megosztás a következőn keresztül:


Konstruktorok használata (C# programozási útmutató)

Egy osztály vagy szerkezet példányosításakor a konstruktor neve is megjelenik. A konstruktorok neve megegyezik az osztály vagy a szerkezet nevével, és általában inicializálják az új objektum adattagjainak nevét.

Az alábbi példában egy elnevezett Taxi osztályt egy egyszerű konstruktor használatával határozunk meg. Ez az osztály ezután az új operátorral lesz példányosítva. A Taxi konstruktort az operátor közvetlenül azután hívja meg, new hogy a memória le van foglalva az új objektumhoz.

public class Taxi
{
    public bool IsInitialized;

    public Taxi()
    {
        IsInitialized = true;
    }
}

class TestTaxi
{
    static void Main()
    {
        Taxi t = new Taxi();
        Console.WriteLine(t.IsInitialized);
    }
}

A paramétereket nem tartalmazó konstruktort paraméter nélküli konstruktornak nevezzük. A paraméter nélküli konstruktorok akkor lesznek meghívva, amikor egy objektumot az new operátorral példányosít, és nem adnak meg argumentumokat.new A C# 12 bemutatja az elsődleges konstruktorokat. Az elsődleges konstruktor olyan paramétereket határoz meg, amelyeket meg kell adni egy új objektum inicializálásához. További információ: Példánykonstruktorok.

Ha az osztály nem statikus, a konstruktorok nélküli osztályok nyilvános paraméter nélküli konstruktort kapnak a C# fordítótól az osztály példányosításának engedélyezéséhez. További információ: Statikus osztályok és statikus osztálytagok.

A konstruktor privátsá tételével megakadályozhatja az osztály példányosítását az alábbiak szerint:

class NLog
{
    // Private Constructor:
    private NLog() { }

    public static double e = Math.E;  //2.71828...
}

További információ: Privát konstruktorok.

A szerkezettípusok konstruktorai az osztálykonstruktorokhoz hasonlítanak. Ha egy strukturálási típust példányosít new, egy konstruktort hív meg a függvény. Ha egy struct értékre default van állítva, a futtatókörnyezet a struktúra összes memóriáját 0 értékre inicializálja. A C# 10 előtt nem lehet explicit paraméter nélküli konstruktort tartalmazni, structs mert a fordító automatikusan biztosít egyet. További információkért tekintse meg a Struktúratípusok cikk Strukturálás inicializálása és alapértelmezett értékei című szakaszát.

A következő kód a paraméter nélküli konstruktort Int32használja, így biztos lehet benne, hogy az egész szám inicializálva van:

int i = new int();
Console.WriteLine(i);

A következő kód azonban fordítóhibát okoz, mert nem használja new, és mivel nem inicializált objektumot próbál használni:

int i;
Console.WriteLine(i);

Másik lehetőségként a (beépített numerikus típusokat is beleértve) alapuló structs objektumok inicializálhatók vagy hozzárendelhetők, majd az alábbi példában leírtak szerint használhatók:

int a = 44;  // Initialize the value type...
int b;
b = 33;      // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);

Az osztályok és a szerkezetek egyaránt definiálhatnak paramétereket használó konstruktorokat, beleértve az elsődleges konstruktorokat is. A paramétereket használó konstruktorokat utasítással new vagy alaputasítással kell meghívni. Az osztályok és a szerkezetek több konstruktort is definiálhatnak, és egyik sem szükséges paraméter nélküli konstruktor definiálásához. Példa:

public class Employee
{
    public int Salary;

    public Employee() { }

    public Employee(int annualSalary)
    {
        Salary = annualSalary;
    }

    public Employee(int weeklySalary, int numberOfWeeks)
    {
        Salary = weeklySalary * numberOfWeeks;
    }
}

Ez az osztály az alábbi utasítások egyikével hozható létre:

Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);

A konstruktorok a base kulcsszóval meghívhatják az alaposztály konstruktorát. Példa:

public class Manager : Employee
{
    public Manager(int annualSalary)
        : base(annualSalary)
    {
        //Add further instructions here.
    }
}

Ebben a példában a rendszer meghívja az alaposztály konstruktorát a konstruktor blokkjának végrehajtása előtt. A base kulcsszó paraméterekkel vagy anélkül is használható. A konstruktor bármely paramétere használható egy kifejezés paramétereként basevagy részeként. További információ: alap.

Származtatott osztályban, ha egy alaposztály-konstruktort nem hív meg explicit módon a base kulcsszó használatával, akkor a paraméter nélküli konstruktort, ha van ilyen, implicit módon hívjuk meg. A következő konstruktor-deklarációk gyakorlatilag megegyeznek:

public Manager(int initialData)
{
    //Add further instructions here.
}
public Manager(int initialData)
    : base()
{
    //Add further instructions here.
}

Ha az alaposztály nem kínál paraméter nélküli konstruktort, a származtatott osztálynak explicit hívást kell kezdeményeznie az alapkonstruktorhoz a használatával base.

A konstruktor ezzel a kulcsszóval meghívhat egy másik konstruktort ugyanabban az objektumban. Például baseparaméterekkel this vagy anélkül is használható, és a konstruktor bármely paramétere elérhető paraméterként thisegy kifejezéshez vagy egy kifejezés részeként. Az előző példában szereplő második konstruktor például a következővel thisírható át:

public Employee(int weeklySalary, int numberOfWeeks)
    : this(weeklySalary * numberOfWeeks)
{
}

A kulcsszó használata az this előző példában a konstruktor meghívását eredményezi:

public Employee(int annualSalary)
{
    Salary = annualSalary;
}

A konstruktorok megjelölhetők nyilvános, privát, védett, belső, védett belső vagy magánvédettként. Ezek a hozzáférési módosítók határozzák meg, hogy az osztály felhasználói hogyan hozhatják létre az osztályt. További információ: Access Modifiers.

A konstruktorok statikus deklarálhatók a statikus kulcsszó használatával. A statikus konstruktorok meghívása automatikusan megtörténik, közvetlenül a statikus mezők elérése előtt, és a statikus osztálytagok inicializálására szolgálnak. További információ: Statikus konstruktorok.

C# nyelvi specifikáció

További információ: Példánykonstruktorok és statikus konstruktorok a C# nyelvi specifikációjában. A nyelvi specifikáció a C#-szintaxis és -használat végleges forrása.

Lásd még