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


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

Ha egy osztály vagy struktúra példányosítása megtörténik, a futtatókörnyezet meghívja a konstruktort. 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 Taxi nevű osztály egy egyszerű konstruktor használatával van definiálva. Ez az osztály ezután a new operátorral lesz példányosítva. A futtatókörnyezet azonnal meghívja a Taxi konstruktort, miután a memória ki van foglalva az új objektumhoz.

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);
    }
}

A paramétereket nem tartalmazó konstruktorokat paraméter nélküli konstruktornak nevezzük. A futtatókörnyezet meghívja a paraméter nélküli konstruktort, amikor egy objektumot a new operátorral példányosítanak, és nem adnak meg argumentumokat a new-hez. C# 12 bevezetett 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óért tekintse meg: 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 szerkezet típusú konstruktorok az osztálykonstruktorokhoz hasonlítanak. Amikor egy struktúratípust newsegítségével példányosítanak, a futtatókörnyezet meghív egy konstruktort. Ha egy structdefault értékre van állítva, a futtatókörnyezet a struktúra összes memóriáját 0 értékre inicializálja. Ha struct típusú mező inicializálókat deklarál, paraméter nélküli konstruktort kell megadnia. További információkért tekintse meg a Struktúra inicializálása és alapértelmezett értékek szakaszt a Struktúratípusok cikkből.

Az alábbi kód a paraméter nélküli konstruktort használja Int32, í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 a new, és mivel nem inicializált objektumot próbál használni:

int i;
Console.WriteLine(i);

Másik lehetőségként néhány struct típus (beleértve az összes beépített numerikus típust) inicializálható vagy hozzárendelhető, majd az alábbi példa szerint használható:

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 elsődleges konstruktorokat. A paramétereket használó konstruktorokat new utasítással vagy alapszintű utasí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éldául:

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éldául:

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

Ebben a példában az alaposztály konstruktorának meghívása a konstruktor blokkjának végrehajtása előtt történik. A base kulcsszó paraméterekkel vagy anélkül is használható. A konstruktor bármely paramétere használható a baseparamétereként, vagy egy kifejezés részeként. További információért lásd: 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 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 basehasználatával.

A konstruktorok a this kulcsszó használatával meghívhatnak egy másik konstruktort ugyanabban az objektumban. A base-hez hasonlóan a this is használhatók paraméterekkel vagy anélkül, és a konstruktor bármely paramétere elérhető paraméterként this, vagy egy kifejezés részeként. Az előző példa második konstruktorát például újraírhatjuk thishasználatával:

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

Az előző példában a this kulcsszó használata a következő konstruktor meghívását eredményezi:

public Employee(int annualSalary) => Salary = annualSalary;

A konstruktorok megjelölhetők public, private, protected, belső, védett belső vagy private protected. 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ó: Hozzáférés-módosítók.

A konstruktorok a static kulcsszóval deklarálhatók statikusan. A statikus konstruktorok meghívása automatikusan megtörténik 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óban. A nyelvi specifikáció a C#-szintaxis és -használat végleges forrása.

Lásd még: