Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.