C# Constructors
Constructor (yapıcı metot), bir sınıftan bir nesne örneği (instance) oluşturulduğunda çağrılan özel bir üye metottur. Bir constructor, sınıfın başlangıç durumunu ayarlamak ve örnek oluşturma sürecinde gerekli başlatma işlemlerini gerçekleştirmek için kullanılır.
Constructor’lar, sınıfın ismiyle aynı adı taşıyan metotlardır ve genellikle sınıfın içinde tanımlanır. Bir sınıf birden fazla constructor’a sahip olabilir ve bu, farklı parametre listeleri ile oluşturma işlemini destekler. Bu durum, aynı sınıftan farklı şekillerde örnekler oluşturmanızı sağlar.
Constructor kelime anlamı olarak inşa etmek demektir. C#’ta constructor aşağıdaki kuralları içermektedir.
- Constructor metotunun geri dönüş tipi yoktur.
- Erişim belirleyicisi public, private ve protected olabilir.
- İsmi sınıf ismi ile aynı olmalıdır.
Örnek constructor tanımı aşağıdaki gibidir:
public class Araba
{
public Araba() // constructor metot
{
Console.Writeline("Constructor metot.");
}
}
Araba nesne = new Araba(); // "Constructor metot" yazılacaktır.
Yukarıdaki örnekte new keyword’ü ile () parantezlerle constructor çağılarak nesne üretilmiştir. Şayet constructor tanımı yapılmaz ise compiler arkada kendisi default bir constructor ekleyecektir. Ve nesne üretiminde o constructor nesne üretecektir.
public class Araba
{
}
Araba nesne = new Araba(); // default constructor çalışıp nesne verecektir.
Bir sınıfta birden fazla constructor metot eklenebilir. Bütün bu constructor metotlarının ismi aynıdır fakat parametrelerle aşırı yüklenmişlerdir.
public class Araba
{
int yas;
string adi;
public Araba() // default constructor
{
Console.WriteLine("Default Constructor");
}
public Araba(string adi) // adini alarak nesne üreten constructor.
{
this.adi = adi;
Console.WriteLine($" adi: {this.adi}");
}
public Araba(int yas) // yasini alarak nesne üreten constructor.
{
this.yas = yas;
Console.WriteLine($" yas: {this.yas}");
}
public Araba(int yas, string adi) // aını ve yasini alarak nesne üreten constructor.
{
this.yas = yas;
this.adi = adi;
Console.WriteLine($" yas: {this.yas} , adi: {this.adi}");
}
}
Araba nesne = new Araba(); // Default Constructor
Araba nesne1 = new Araba("Mercedes"); // adi: Mercedes
Araba nesne2 = new Araba(10); // yas: 10
Araba nesne3 = new Araba(10, "Renault"); // yas: 10 , adi: Renault
Yukarıdaki örnekte aşırı yüklenmiş contructor’larla farklı özelliklerde nesneler üretilmiştir. Yani bizim verdiğim parametrelerle hangi constructor’dan nesne üreteceğini compiler biliyor.
Fakat şöyle bir istek olsaydı, bir tane constructor tetiklenirken arkada zincir gibi birden fazla constructor tetiklensin isteniyorsa nasıl olacak ? Bunun için imdada “this” keyword’ü yetişiyor. “this” keyword’ü C#’ta bir sınıftan üretilen nesnenin referansını işaret eder. Dolayısıyla bir sınıfın içinde this.balbla denirse o sınıfın diğer elemanlarına( field, method, property, event vs) erişilir. Aşağıdaki örnekte gösterilmiştir.
public class Araba
{
int yas;
string adi;
public Araba():this("Mercedes") // bu parametresiz constructor this ile string adi parametresini alan constructoru çağırıyor.
{
Console.WriteLine("Default Constructor");
}
public Araba(string adi) : this(15, adi) // bu string adi parametresini alan constructor this ile int yasi, string adi parametrelerini alan constructoru çağırıyor.
{
this.adi = adi;
Console.WriteLine($"adi: {this.adi}");
}
public Araba(int yas, string adi)
{
this.yas = yas;
this.adi = adi;
Console.WriteLine($"yas: {this.yas} , adi: {this.adi}");
}
}
Araba nesne = new Araba(); // çıktı aşağıdaki gibi olacaktır.
yas: 15 , adi: Mercedes
adi: Mercedes
Default Constructor
Yukarıdaki örnekte ilk önce parametresiz constructor ile nesne üretiliyor. Bu parametresiz constructor this ile “adi” parametresini alan constructor’u çağırıyor. Sonra, bu “adi” parametresini alan constructor this ile “yasi”, “adi” parametrelerini alan constructor’u çağırıyor. Dolayısıyla nesne üretme aşamasında çalışma sıraları şöyle; Çıktıda çalışma sırası belli oluyor zaten.
- Araba(15 , “Mercedes”);
- Araba(“Mercedes”);
- Araba();
Constructor Çeşitleri
C#’ta bir sınıfta 5 farklı constructor tanımı yapılabilmektedir. Bu constructor’ların her birinin kullanım amacı farklıdır. Aşağıda tam listesi verilmiştir.
- Default Constructor
- Parameterized Constructor
- Copy Constructor
- Static Constructor
- Private Constructor
1) Default Constructor
Default constructor yukarıda anlatıldığı gibi sınıf tanımı yaparken açıkça yazılabildiği gibi, yazılmadığı takdirde ise compiler’ın ekleyeceği default bir constructor’dır. Aşağıdaki örnekte açıkça belirtilmiştir.
public class Araba
{
public Araba() // constructor metot
{
Console.Writeline("Constructor metot.");
}
}
2) Parameterized Constructor(Parametreli)
Bu constructor parametre alabilir. Genellikle sınıf üyelerine ilk atamaları yapmak için bu parametreler alınır. Farklı parametre sayısı ve veri tipi ile constructor aşırı yüklenebilir.
public class Araba
{
int yas;
string adi;
public Araba(string adi) // adini alarak nesne üreten constructor.
{
this.adi = adi;
Console.WriteLine($" adi: {this.adi}");
}
public Araba(int yas) // yasini alarak nesne üreten constructor.
{
this.yas = yas;
Console.WriteLine($" yas: {this.yas}");
}
public Araba(int yas, string adi) // aını ve yasini alarak nesne üreten constructor.
{
this.yas = yas;
this.adi = adi;
Console.WriteLine($" yas: {this.yas} , adi: {this.adi}");
}
}
Araba nesne1 = new Araba("Mercedes"); // adi: Mercedes
Araba nesne2 = new Araba(10); // yas: 10
Araba nesne3 = new Araba(10, "Renault"); // yas: 10 , adi: Renault
3) Copy Constructor
Bu constructor ise bir objenin değerlerini kopyalayarak yeni bir obje döndürür. Örnek incelenirse daha net anlaşılacaktır.
public class Araba
{
public int yas;
public string adi;
public Araba(Araba araba) // kopyalayarak nesne üreten constructor.
{
this.yas = araba.yas;
this.adi = araba.adi;
}
}
4) Static Constructor
Static constructor o sınıftan sadece ilk nesne üretildiğinde çalışır. Daha sonraki nesne üretme aşamalarında çağrılmaz. Static constructor kendine has özellikleri vardır.
- Static constructor herhangi bir access modifier almaz.
- Static constructor herhangi bir parametre almaz.
- Static constructor sadece ilk nesne üretme esnasında otomatik çağrılır.
- Static constractor direkt çağrılamaz.
- Bir sınıfta sadece bir tane static constructor olabilir.
- Static constructor sadece sınıfın static elemanlarına erişebilir.
public class Araba
{
public int yas;
public string adi;
static Araba() // static constructor parametre almaz ve acces identifier'i olmaz.
{
this.adi = "Sadece ilk nesne üretildiğinde setlenecek";
}
}
Araba nesne1 = new Araba();
Console.Writeline(nesne1.adi); // Sadece ilk nesne üretildiğinde setlenecek
Araba nesne2 = new Araba(); // burası boş
5) Private Constructor
Private constructor sadece sınıfın içinden çağırılabilmektedir. Genellikle Singleton yapmak için static constructor içinden çağrılır. Dışardan başka sınıflar erişemezler.
Constructor’lar, .NET platformunda sınıf yapısının temel bir parçasıdır ve sınıfların örneklendirme sürecinde önemli bir rol oynar. Doğru constructor’ları kullanmak, sınıfın başlangıç durumunu doğru şekilde ayarlamaya ve uygulamanın beklenen davranışını sağlamaya yardımcı olur.