Kurucu Metodlar(Constructors)
Constructors bir nesne tanımladığımızda nesneyi tanımladığımız sınıfta bulunan ve çalışan ilk metoddur.
MyClass m = new MyClass(); Nesne oluştururken burada parantezin görevi Constructors'u tetiklemektir.
Kurucu metodlar herhangi bir sınıftan nesne tanımladığımızda belirlediğimiz özelliklerle otomatik olarak çalışan bir yapıdır. Kurucu metodları isteğimize göre sınıf içerisinde tanımlayıp tanımlamamız bize kalmıştır. Sınıftan nesneyi türettiğimiz anda kurucu metod çalışır. Kurucu metod ismi sınıf ismi ile aynı olmak zorundadır. Herhangi bir geri dönüş değeri olamaz, bildirilemez ve erişim belirleyicisi public olmak zorundadır. Constructors parametre alabilen bir yapıya sahiptir.
Varsayılan Kurucu Metod(Default Constructor)
Bir sınıf içerisinde bir kurucu metod tanımlayalım, bu kurucu metodun içerisindeki bir özelliğe kurucu metod içerisinde değer atayalım. İşte bu olaya (Default)Varsayılan kurucu metod denir.
C#:
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Deniz deniz1 = new Deniz();
Console.WriteLine(deniz1.renk);
}
}
class Deniz
{
public string renk { get; set; }
public Deniz()
{
renk = "MAVİ";
Console.WriteLine("Denizin rengi {0}dir", renk);
}
}
}
Kod:
Denizin rengi MAVİdir
MAVİ
Yukarıda gördüğünüz gibi renk özelliğini Deniz sınıfında, Deniz kurucu metodunun içerisinde varsayılan olarak mavi yaptık. Bunu nesneyi oluşturduğumuzda kurucu metodun otomatik çağrılması sayesinde başardık.
Aşırı Yüklenmiş Kurucu Metod(Constructor Overloading)
Aşırı yüklenmiş kurucu metod kısaca bir sınıf içerisinden aynı isimde birden fazla kurucu metodun tanımlanma olayıdır. Nesne tanımlarken hangi kurucu metodu kullanacağımız verdiğimiz parametreye bağlıdır.
C#:
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Deniz deniz1 = new Deniz();
Console.WriteLine(deniz1.Renk);
Deniz deniz2 = new Deniz(33);
Console.WriteLine(deniz2.Derinlik);
Deniz deniz3 = new Deniz("Temiz");
Console.WriteLine(deniz3.Durum);
}
}
class Deniz
{
public string Renk { get; set; }
public double Derinlik { get; set; }
public string Durum { get; set; }
public Deniz()
{
Renk = "MAVİ";
Console.WriteLine("Denizin rengi {0}dir", Renk);
}
public Deniz(double derinlik)
{
this.Derinlik = derinlik;
}
public Deniz(string durum)
{
this.Durum = durum;
}
}
}
Kod:
Denizin rengi MAVİdir
MAVİ
33
Temiz
Constructors metodlarda this keyword'ü
Constructors metodlarda this keyword'ü, overloading constructors metodlar arası geçiş yapmamıza olanak sağlıyor.
C#:
class Program
{
static void Main(string[] args)
{
MyClass m = new MyClass(2, 3);
}
}
class MyClass
{
public MyClass(int a)
{
Console.WriteLine("1. Constructors metod");
}
public MyClass(int b, int c) : this(b)
{
Console.WriteLine("2. Constructors metod");
}
}
Kod:
1. Constructors metod
2. Constructors metod
Burada 2 parametreli kurucu metodu çağırdık oda this keyword'ü ile tek parametreli metodu çağırdı. This keywordüne parametre olarak metod içersindeki değeri verebiliriz yada kendimiz manuel olarak değer veririz. Class içerisindeki field değerlerini parametre olarak veremeyiz çünkü görmeyecektir.
Not: Buradaki bütün özellikler Recordlar için de geçerlidir.
Destructor Metod (Yıkıcı Metod)
Oluşturulan bir nesne imha edilirken otomatik olarak çağrılan metoda, destructor metod denir. Sadece classlarda destructor bulunur ve sadece bir tanedir. Yani destructor metodlarda overload işlemi yapılmaz ve destructor metodlar herhangi bir parametre almaz.
Bir nesnenin imha edildiği durumlar:
- Nesne herhangi bir referans tarafından işaretlendirilmemişse,
- Oluşturulduğu veya kullanıldığı bölüm bitmiş ise, yani birdaha erişilemez halde ise nesne Garbage Collector tarafından imha edilir.
C#:
class MyClass
{
~MyClass()
{
Console.WriteLine("Byee");
}
}
Deconstruct Metodu
Bir sınıftan oluşturulan bir nesnenin belli fieldlarını almak istediğimizde deconstruct metodunu kullanırız. Bu metod sınıf içersinde Deconstruct ismiyle tanımlanmakta ve nesne üzerinden belirtilen değerleri tuble olarak döndürmemize olanak sağlar.
C#:
class Program
{
static void Main(string[] args)
{
MyClass ogrenci = new MyClass()
{
isim = "osman",
yas = 33,
no = 1212312
};
var (x, y) = ogrenci;
Console.WriteLine($"{x} ve {y}");
}
}
class MyClass
{
public string isim { get; set; }
public int yas { get; set; }
public int no { get; set; }
public void Deconstruct(out string _x, out int _y)
{
_x = isim;
_y = yas;
}
}
Geriye herhangi bir değer döndürmediğimiz için void olarak tanımlanır. Deconstruct metodun parametleri out olarak tanımlanır. out parametrelerin dışarı açılmasını sağlıyordu bu sayede parametreleri dışarı açtık.
Static Constructor
Bir sınıftan nesne üretilirken ilk tetiklenen "constructor" değil "static constructor" dır. Şimdi construcktor bir sınıftan üretilen her nesnede tetiklenen metoddur. "static constructor" ise bir sınıftan üretilen ilk nesne esnasında tetiklenen bir metoddur ve ilk nesne üretimi dışında bir daha tetiklenmez. Yani birisi her nesne üretildiğinde diğeri ise ilk nesne üretiminde tetiklenir.static constructor'larda overloading yapılmaz, parametre almaz, geri dönüş değeri ve erişim belirleyicileri tanımlanmaz. Sınıf ismi ile aynı isme sahiptir.
C#:
static void Main(string[] args)
{
MyClass m1 = new MyClass();
Console.WriteLine("******************");
MyClass m2 = new MyClass();
}
}
class MyClass
{
public MyClass()
{
Console.WriteLine("Constructor tetiklendi.");
}
static MyClass()
{
Console.WriteLine("Static Constructor tetiklendi.");
}
}
Kod:
Static Constructor tetiklendi.
Constructor tetiklendi.
******************
Constructor tetiklendi.
Gördüğünüz gibi ilk static constructor tetiklendi ve bir kez tetiklendikten sonra bir daha tetiklenmedi.
Statik contrucktor'un tetiklenmesi için o sınıftan bir nesne oluşturulmalı yada sınıf içerisinde herhangi bir static yapılanmanın tetiklenmesi gerekmektedir.
