Örnek oluşturucuları (C# programlama kılavuzu)

İfadeyle yeni bir tür örneği oluşturduğunuzda yürütülen kodu belirtmek için bir örnek oluşturucu bildirirsiniz.new Statik olmayan bir sınıfta statik sınıfı veya statik değişkenleri başlatmak için statik bir oluşturucu tanımlayabilirsiniz.

Aşağıdaki örnekte gösterildiği gibi, tek bir türde birkaç örnek oluşturucu bildirebilirsiniz:

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

Yukarıdaki örnekte, ilk, parametresiz oluşturucu, iki bağımsız değişkene eşit 0olan ikinci oluşturucuyu çağırır. Bunu yapmak için anahtar sözcüğünü this kullanın.

Türetilmiş bir sınıfta bir örnek oluşturucu bildirdiğinizde, temel sınıfın oluşturucusunun çağrısını yapabilirsiniz. Bunu yapmak için aşağıdaki örnekte gösterildiği gibi anahtar sözcüğünü kullanın base :

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

Parametresiz oluşturucular

Bir sınıfın açık örnek oluşturucusu yoksa, C# aşağıdaki örnekte gösterildiği gibi bu sınıfın örneğini oluşturmak için kullanabileceğiniz parametresiz bir oluşturucu sağlar:

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

Bu oluşturucu, örnek alanlarını ve özelliklerini ilgili başlatıcılara göre başlatır. Bir alan veya özelliğin başlatıcısı yoksa, değeri alanın veya özelliğin türünün varsayılan değerine ayarlanır. Bir sınıfta en az bir örnek oluşturucu bildirirseniz, C# parametresiz oluşturucu sağlamaz.

Yapı türü her zaman parametresiz bir oluşturucu sağlar. Parametresiz oluşturucu, bir türün varsayılan değerini üreten örtük bir parametresiz oluşturucudur veya açıkça bildirilen parametresiz oluşturucudur. Daha fazla bilgi için Yapı türleri makalesinin Yapı başlatma ve varsayılan değerler bölümüne bakın.

Birincil oluşturucular

C# 12'de başlayarak, sınıflarda ve yapılarda birincil oluşturucu bildirebilirsiniz. Herhangi bir parametreyi, tür adını izleyerek parantez içinde yerleştirirsiniz:

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

Birincil oluşturucunun parametreleri, bildirim türünün tüm gövdesinde kapsam içindedir. Özellikleri veya alanları başlatabilir. Yöntemlerde veya yerel işlevlerde değişken olarak kullanılabilirler. Bunlar bir temel oluşturucuya geçirilebilir.

Birincil oluşturucu, bu parametrelerin türün herhangi bir örneği için gerekli olduğunu gösterir. Açıkça yazılmış herhangi bir oluşturucu birincil oluşturucuyu this(...) çağırmak için başlatıcı söz dizimini kullanmalıdır. Bu, birincil oluşturucu parametrelerinin kesinlikle tüm oluşturucular tarafından atanmasını sağlar. Türler de dahil olmak üzere herhangi bir class tür için record class , birincil oluşturucu mevcut olduğunda örtük parametresiz oluşturucu yayılmaz. Türler de dahil olmak üzere herhangi bir struct tür için record struct örtük parametresiz oluşturucu her zaman yayılır ve birincil oluşturucu parametreleri de dahil olmak üzere tüm alanları her zaman 0 bit desenine başlatır. Açık bir parametresiz oluşturucu yazarsanız, birincil oluşturucuyu çağırması gerekir. Bu durumda, birincil oluşturucu parametreleri için farklı bir değer belirtebilirsiniz. Aşağıdaki kodda birincil oluşturucu örnekleri gösterilmektedir.

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

Özniteliğinde hedefi belirterek sentezlenmiş birincil oluşturucu yöntemine method: öznitelikler ekleyebilirsiniz:

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

Hedefi belirtmezseniz method , özniteliği yöntemi yerine sınıfına yerleştirilir.

ve struct türlerindeclass, birincil oluşturucu parametreleri türün gövdesinde herhangi bir yerde kullanılabilir. Bunlar üye alanları olarak kullanılabilir. Birincil oluşturucu parametresi kullanıldığında, derleyici oluşturucu parametresini derleyici tarafından oluşturulan bir adla özel bir alanda yakalar. Türün gövdesinde birincil oluşturucu parametresi kullanılmazsa, özel alan yakalanmaz. Bu kural, bir temel oluşturucuya geçirilen birincil oluşturucu parametresinin iki kopyasını yanlışlıkla ayırmayı önler.

Tür değiştiriciyi record içeriyorsa, derleyici bunun yerine birincil oluşturucu parametresiyle aynı ada sahip bir ortak özelliği sentezler. Türler için record class , birincil oluşturucu parametresi temel birincil oluşturucuyla aynı adı kullanıyorsa, bu özellik temel record class türün ortak özelliğidir. Türetilmiş record class türde yinelenmez. Bu özellikler, tür olmayanlarrecord için oluşturulmaz.

Ayrıca bkz.