Site icon Serdar Yılmaz

C# – Garbage Collection ve Yıkıcı Metotlar

Yıkıcı metotlara geçmeden önce Garbage Collection mekanizması hakkında bilgi vermekte fayda var.

Garbage Collection

Garbage Collection erişilemeyen nesneleri silerek belleğin verimli bir şekilde kullanılmasını sağlamaktadır. Konuyu örnekler üzerinden açıklamaya devam edelim;

Ogrenci ogr = new Ogrenci();

Yukarıdaki kod satırında “new Ogrenci()” komutu ile Heap bellek bölgesinde Ogrenci sınıfından bir nesne oluşturduk. Bu nesneye erişebilmek için adresini, belleğin Stack bölgesinde tutulan “ogr” ismindeki işaretçiye aktardık. Herhangi bir şekilde “ogr” isimli işaretçiyi kaybedersek, Heap bellek bölgesinde oluşturduğumuz nesneye erişmemiz mümkün olmayacaktır. Erişilemeyen nesnelerde Garbage Collection tarafından silinerek bellekte gereksiz yer kaplaması önlenecektir.

Ogrenci ogr1 = new Ogrenci();
Ogrenci ogr2 = new Ogrenci();
ogr1 = ogr2;

Bu örneğimizde Ogrenci sınıfından iki adet nesne oluşturduk. 1. ve 2. satırlarda ilk oluşturduğumuz nesnenin adresini “ogr1” işaretçisine, ikinci oluşturduğumuz nesnenin adresini “ogr2 işaretçisine aktardık. 3. satırda ise ikinci nesnenin adresini, ilk nesnenin adresini tutan “ogr1” işaretçisine aktardık. Yani artık ogr1 işaretçisi, ilk nesnenin adresini değil ikinci nesnenin adresini tutmaktadır. İlk oluşturulan nesnenin adresi kaybedildiği için artık o nesneye ulaşmak mümkün olmayacaktır. Nesneye erişimin mümkün olmadığı durumlarda nesnenin bellekte kalmasının bir anlamı yoktur. Bu yüzden Garbage Collection tarafından silinecektir.

Garbage Collection mekanizmasının ne zaman devreye gireceği kesin olarak bilinemez. Arkaplanda programcıdan bağımsız bir şekilde çalışmaktadır.

Yıkıcı Metotlar

Erişilemeyen bir nesnenin Garbage Collection tarafından silinmeden hemen önce çalışan metoduna Yıkıcı Metot denilmektedir. Bir nesnenin silinmeden önce yapmasını istediğimiz şeyleri o nesnenin yıkıcı metodu içerisine yazarız.

Yıkıcı Metot Nasıl Tanımlanır ?

  1. Yıkıcı metodun adı sınıf adıyla aynı olmalıdır ve başında “~” işareti olmalıdır.
  2. Parametresi, geri dönüş değeri ve erişim belirteci olmamalıdır.
class Oyuncu
{
    public static int OyuncuSayisi=0;

    public string KullaniciAdi;
    public string Sifre;
    public int Skor;

    public Oyuncu()
    {
        OyuncuSayisi++;
    }

    ~Oyuncu()
    {
        OyuncuSayisi--;
    }
}

Oyuncu sınıfından her nesne oluşturulduğunda “OyuncuSayisi” isimli static değişkenin değeri bir arttırılacak ve nesne silinmeden önce değeri bir azaltılacaktır.

Serdar YILMAZ

Exit mobile version