Yapıcı metotlar nesne ilk oluşturulduğunda çalışırlar ve nesneyi bir nevi ilk kullanıma hazırlarlar. Bir sınıftan new anahtar kelimesi ile nesne oluşturulmadığı sürece çalışmazlar. Yapıcı metotlar sınıf ile aynı isme sahiptirler ve geriye bir veri döndürmezler.

C# - Constructors (Yapıcı Metotlar)

Her sınıf, oluşturulduğunda kendisine null değeri atayacak bir yapıcı metoda sahiptir. Biz yeni bir constructor tanımlarken bir nevi önceki metodu override ederiz.

Yapıcı metotlar sayesinde sınıftan bir nesne oluşturulurken programcıyı belirli parametreler vermeye zorlayabiliriz. Ya da sınıfın ilk oluşturulma anında aldığımız parametrelere göre belirli işlemler yapabilir veya sınıf özelliklerinin varsayılan değerlerini ayarlayabiliriz.

Yapıcı metotlar tıpkı diğerleri gibi overload edilebilirler. Manüel olarak tetiklenemezler, kendi çalışma zamanları vardır. Geriye değer döndürmezler ancak void değildirler.

class Uye
{
    public Uye()
    {
        this.Ad = "Yok";
        this.Parola = "Yok";
    }

    public string Ad { get; set; }
    public string Parola { get; set; }
}

Yukarıdaki örnekte bir parametre almadık. Sadece sınıftan bir nesne üretildiğinde Ad ve Parola özelliklerinin değerlerini "Yok" olarak ayarladık. Aşağıdaki gibi deneyebilirsiniz.

Uye uye = new Uye();
Console.WriteLine(uye.Ad);

Evet, bu şekilde bazı olası hataların önüne geçmiş olduk. Ancak değerleri varsayılan olarak atadığımız için yazılımcı özelliklerin dolu olup olmadığını anlayamayacaktır. Bunun yerine aşağıdaki gibi yazılımcıyı değer girmeye zorlayabiliriz.

class Uye
{
    public Uye(string ad, string parola)
    {
        this.Ad = ad;
        this.Parola = parola;
    }

    public string Ad { get; set; }
    public string Parola { get; set; }
}

Böylece belki daha uğraştırıcı ama daha güvenli yol bulmuş olduk. Örnek aşağıda.

Uye uye = new Uye("umutcoskun", "123456");
Console.WriteLine(uye.Ad);

Yapıcı metotları aşırı yükleyebildiğimizden bahsetmiştik. Öyleyse şimdi yukarıdaki her iki örneği de kullanıp seçimi yazılımcıya bırakalım. İster varsayılan değerleri kullansın, ister kendi belirlesin.

class Uye
{
    public Uye()
    {
        this.Ad = "Yok";
        this.Parola = "Yok";
    }

    public Uye(string ad, string parola)
    {
        this.Ad = ad;
        this.Parola = parola;
    }

    public string Ad { get; set; }
    public string Parola { get; set; }
}

Aşağıda görüldüğü üzere istenilen şekilde kullanılabilir.

Uye uye = new Uye("umutcoskun", "123456");
Console.WriteLine(uye.Ad);

Uye baskaUye = new Uye();
Console.WriteLine(baskaUye.Ad);

Türemiş (derived) sınıflar kendi temel (base) sınıflarının yapıcı metotlarını tetiklerler. Mesela aşağıdaki gibi bir örnek yapalım.

class Hayvan
{
    public Hayvan()
    {
        Console.WriteLine("Hayvan yapıcı metodu tetiklendi.");
    }
}

class Memeli : Hayvan
{
    public Memeli()
    {
        Console.WriteLine("Memeli yapıcı metodu tetiklendi.");
    }
}

class Fare : Memeli
{
    public Fare()
    {
        Console.WriteLine("Fare yapıcı metodu tetiklendi.");
    }
}

Aşağıdaki gibi Fare sınıfından bir nesne oluşturup deneme yapalım.

Fare fare = new Fare();

Gördüğünüz üzere bütün yapıcı metotlar Hayvan > Memeli > Fare sırasıyla hiyerarşik olarak tetiklendi.

Hayvan yapıcı metodu tetiklendi. Memeli yapıcı metodu tetiklendi. Fare yapıcı metodu tetiklendi.

Yapıcı metotların erişim belirleyicisi public olmalıdır. Aksi takdirde "inaccessable due to its protection level" hatası alabilirsiniz. Statik sınıflarda yapıcı metot tanımlanamaz. Eğer denerseniz "static classes cannot have instance constructors" hatası alırsınız.