Aracılığıyla paylaş


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

Bir türün yeni bir örneğini oluşturduğunuzda ifadeyle yürütülen kodu belirtmek için bir örnek yapıcıyı açıklarsınıznew. 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ısı 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, tanımlayan türün tüm gövdesinde kapsam içindedir. Özellikleri veya alanları başlatmak mümkün. Yöntemlerde veya yerel işlevlerde değişken olarak kullanılabilirler. Bunlar bir taban 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. Herhangi bir class veya record class türü için, birincil oluşturucu mevcut olduğunda örtük parametresiz oluşturucu oluşturulmaz. Herhangi bir struct türü için, record struct türleri de dahil olmak üzere, örtük parametresiz oluşturucu her zaman oluşturulur ve tüm alanları, birincil oluşturucu parametreleri de dahil olmak üzere, her zaman 0 bit deseniyle 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ğin hedefini belirterek sentezlenmiş birincil yapıcı metoda öznitelikler ekleyebilirsiniz:

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

Hedefi method belirtmezseniz, öznitelik yöntem yerine sınıfa yerleştirilir.

class ve struct türlerinde, birincil oluşturucu parametreleri türün gövdesinde herhangi bir yerde kullanılabilir. Parametre, yakalanmış özel bir alan olarak uygulanabilir. Bir parametreye yalnızca başlatıcılar ve oluşturucu çağrıları başvuruyorsa, bu parametre özel bir alanda yakalanmaz. Türün diğer üyelerinde parametrenin kullanılması, derleyicinin bu parametreyi özel bir alanda yakalamasına neden olur.

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 kopyalanmaz. Bu özellikler, record olmayan türler için oluşturulmaz.

Ayrıca bakınız