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


Példánykonstruktorok (C# programozási útmutató)

Deklarál egy példánykonstruktort, amely megadja a kifejezéssel rendelkező new új típusú példány létrehozásakor végrehajtott kódot. Statikus osztály vagy statikus változó nem statikus osztályban való inicializálásához statikus konstruktort is definiálhat.

Ahogy az alábbi példa is mutatja, több példánykonstruktort is deklarálhat egy típusban:

class Coords
{
    public Coords()
        : this(0, 0)
    {  }

    public Coords(int x, int y)
    {
        X = x;
        Y = y;
    }

    public int X { get; set; }
    public int Y { get; set; }

    public override string ToString() => $"({X},{Y})";
}

class Example
{
    static void Main()
    {
        var p1 = new Coords();
        Console.WriteLine($"Coords #1 at {p1}");
        // Output: Coords #1 at (0,0)

        var p2 = new Coords(5, 3);
        Console.WriteLine($"Coords #2 at {p2}");
        // Output: Coords #2 at (5,3)
    }
}

Az előző példában az első paraméter nélküli konstruktor a második konstruktort mindkét argumentummal egyenlőnek 0hívja. Ehhez használja a kulcsszót this .

Ha egy példánykonstruktort származtatott osztályban deklarál, meghívhatja egy alaposztály konstruktorát. Ehhez használja a kulcsszót base az alábbi példában látható módon:

abstract class Shape
{
    public const double pi = Math.PI;
    protected double x, y;

    public Shape(double x, double y)
    {
        this.x = x;
        this.y = y;
    }

    public abstract double Area();
}

class Circle : Shape
{
    public Circle(double radius)
        : base(radius, 0)
    {  }

    public override double Area() => pi * x * x;
}

class Cylinder : Circle
{
    public Cylinder(double radius, double height)
        : base(radius)
    {
        y = height;
    }

    public override double Area() => (2 * base.Area()) + (2 * pi * x * y);
}

class Example
{
    static void Main()
    {
        double radius = 2.5;
        double height = 3.0;

        var ring = new Circle(radius);
        Console.WriteLine($"Area of the circle = {ring.Area():F2}");
        // Output: Area of the circle = 19.63
        
        var tube = new Cylinder(radius, height);
        Console.WriteLine($"Area of the cylinder = {tube.Area():F2}");
        // Output: Area of the cylinder = 86.39
    }
}

Paraméter nélküli konstruktorok

Ha egy osztály nem rendelkezik explicit példánykonstruktorokkal, a C# paraméter nélküli konstruktort biztosít, amellyel az osztály egy példányát példányosíthatja, ahogyan az alábbi példa mutatja:

public class Person
{
    public int age;
    public string name = "unknown";
}

class Example
{
    static void Main()
    {
        var person = new Person();
        Console.WriteLine($"Name: {person.name}, Age: {person.age}");
        // Output:  Name: unknown, Age: 0
    }
}

Ez a konstruktor inicializálja a példánymezőket és -tulajdonságokat a megfelelő inicializálók szerint. Ha egy mező vagy tulajdonság nem rendelkezik inicializálóval, annak értéke a mező vagy tulajdonság típusának alapértelmezett értékére van állítva. Ha egy osztályban legalább egy példánykonstruktort deklarál, a C# nem biztosít paraméter nélküli konstruktort.

A struktúratípus mindig paraméter nélküli konstruktort biztosít. A paraméter nélküli konstruktor implicit paraméter nélküli konstruktor, amely egy típus alapértelmezett értékét állítja elő, vagy explicit módon deklarált paraméter nélküli konstruktor. 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.

Elsődleges konstruktorok

A C# 12-től kezdődően az osztályokban és a szerkezetekben deklarálhat egy elsődleges konstruktort . A paramétereket zárójelbe kell helyeznie a típusnév alapján:

public class NamedItem(string name)
{
    public string Name => name;
}

Az elsődleges konstruktor paraméterei a deklarálási típus teljes törzsében találhatók. Inicializálhatják a tulajdonságokat vagy mezőket. A metódusok és a helyi függvények változóiként használhatók. Átadhatók egy alapkonstruktornak.

Az elsődleges konstruktor azt jelzi, hogy ezek a paraméterek a típus bármely példányához szükségesek. Minden explicit módon írt konstruktornak az this(...) inicializáló szintaxist kell használnia az elsődleges konstruktor meghívásához. Ez biztosítja, hogy az elsődleges konstruktor paramétereit minden konstruktor hozzárendelje. Az implicit paraméter nélküli konstruktor nem lesz kibocsátva bármilyen class típus esetében, beleértve a típusokat is record class , ha elsődleges konstruktor van jelen. Minden struct típus esetében, beleértve record struct a típusokat is, az implicit paraméter nélküli konstruktor mindig ki lesz bocsátva, és mindig inicializál minden mezőt, beleértve az elsődleges konstruktorparamétereket is, a 0 bites mintába. Ha explicit paraméter nélküli konstruktort ír, az elsődleges konstruktort kell meghívnia. Ebben az esetben megadhat egy másik értéket az elsődleges konstruktorparaméterekhez. Az alábbi kód példákat mutat be az elsődleges konstruktorokra.

// name isn't captured in Widget.
// width, height, and depth are captured as private fields
public class Widget(string name, int width, int height, int depth) : NamedItem(name)
{
    public Widget() : this("N/A", 1,1,1) {} // unnamed unit cube

    public int WidthInCM => width;
    public int HeightInCM => height;
    public int DepthInCM => depth;

    public int Volume => width * height * depth;
}

A szintetizált elsődleges konstruktor metódushoz attribútumokat adhat hozzá az method: attribútum céljának megadásával:

[method: MyAttribute]
public class TaggedWidget(string name)
{
   // details elided
}

Ha nem adja meg a célértéket method , az attribútum a metódus helyett az osztályra kerül.

A class típusban és struct típusokban az elsődleges konstruktorparaméterek bárhol elérhetők a típus törzsében. A paraméter rögzített privát mezőként implementálható. Ha egy paraméterre csak inicializálók és konstruktorhívások hivatkoznak, a paraméter nem lesz rögzítve privát mezőben. A típus többi tagjának használata miatt a fordító egy privát mezőben rögzíti a paramétert.

Ha a típus tartalmazza a record módosítót, a fordító ehelyett egy olyan nyilvános tulajdonságot szintetizál, amelynek neve megegyezik az elsődleges konstruktorparaméter nevével. Típusok esetén record class , ha egy elsődleges konstruktorparaméter ugyanazt a nevet használja, mint az elsődleges alapkonstruktor, akkor ez a tulajdonság az alaptípus record class nyilvános tulajdonsága. A rendszer nem duplikálja a származtatott record class típusban. Ezek a tulajdonságok nem nem típusok eseténrecord jönnek létre.

Lásd még