Yükleniyor...

C# Constructor, Destructor ve this Kullanımı

C#’ta constructor, destructor ve this anahtar kelimesinin kullanımını öğrenin. Nesne yaşam döngüsü ve sınıf içi erişim örneklerle anlatılıyor.

C#’ta sınıflar ve yapılar, nesnelerin nasıl oluşturulacağını ve nasıl yok edileceğini belirlemek için özel metotlara sahiptir. Constructor (yapıcı) nesne oluşturulurken çalışır ve başlangıç değerlerini ayarlar. Destructor (yıkıcı) nesne bellekten atılmadan önce çağrılır. this anahtar kelimesi ise, sınıfın kendi örneğini (current instance) ifade eder ve özellikle aynı isimli parametreler veya metot zincirlemelerinde kullanılır.


Constructor (Yapıcı Metot)

Constructor, sınıf adıyla aynı isme sahip özel bir metottur. Yeni bir nesne oluşturulduğunda otomatik olarak çalışır ve genellikle başlangıç değerlerini atamak için kullanılır. Parametre alabilir ve overloading yapılabilir. Eğer hiçbir constructor tanımlanmazsa, C# varsayılan (parametresiz) bir constructor ekler.


public class Product
{
    public string Name { get; set; }
    public decimal Price { get; set; }

    // Parametresiz constructor
    public Product()
    {
        Name = "Bilinmiyor";
        Price = 0;
    }

    // Parametreli constructor
    public Product(string name, decimal price)
    {
        Name = name;
        Price = price;
    }

    public void Print()
    {
        Console.WriteLine($"{Name} - {Price:0.00} TL");
    }
}

class Program
{
    static void Main()
    {
        var p1 = new Product(); // parametresiz
        var p2 = new Product("Defter", 45m); // parametreli

        p1.Print(); // Bilinmiyor - 0.00 TL
        p2.Print(); // Defter - 45.00 TL
    }
}

Destructor (Yıkıcı Metot)

Destructor, sınıfın önüne ~ işareti konularak tanımlanır ve parametre almaz. Bir nesne Garbage Collector tarafından bellekten temizlenmeden hemen önce çağrılır. Genellikle dosya kapatma, bellek serbest bırakma gibi temizleme işlemleri için düşünülse de, .NET’in Garbage Collector sistemi sayesinde çoğu durumda manuel destructor tanımlamaya gerek kalmaz.


public class Logger
{
    public Logger()
    {
        Console.WriteLine("Logger başlatıldı.");
    }

    ~Logger()
    {
        Console.WriteLine("Logger bellekten temizlendi.");
    }
}

class Program
{
    static void Main()
    {
        var log = new Logger();
        log = null;

        // Garbage Collector'u tetikleyelim
        GC.Collect();
        GC.WaitForPendingFinalizers();
    }
}

this Anahtar Kelimesi

this, bir sınıfın mevcut örneğine işaret eder. Aynı isimli parametrelerle property’leri ayırmak, metot zincirleme yapmak veya kendi sınıfından constructor çağırmak için kullanılır.


public class Customer
{
    public string Name { get; set; }
    public string Email { get; set; }

    // Constructor parametre isimleri ile property isimleri aynı
    public Customer(string name, string email)
    {
        this.Name = name;   // this ile property'e atama
        this.Email = email;
    }

    // Metot zincirleme (method chaining)
    public Customer SetName(string name)
    {
        this.Name = name;
        return this;
    }

    public Customer SetEmail(string email)
    {
        this.Email = email;
        return this;
    }

    public void Print()
    {
        Console.WriteLine($"{Name} - {Email}");
    }
}

class Program
{
    static void Main()
    {
        var c = new Customer("Ali", "ali@example.com")
                    .SetName("Veli")
                    .SetEmail("veli@example.com");

        c.Print(); // Veli - veli@example.com
    }
}

this ile Constructor Çağırma

Aynı sınıf içindeki bir constructor’dan diğerine çağrı yapmak için this(...) kullanılır. Bu yaklaşım tekrar eden kodları azaltır ve ortak atamaları merkezi bir yerde toplar.


public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name) : this(name, 0) // diğer constructor'ı çağırır
    {
    }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public void Print()
    {
        Console.WriteLine($"{Name} ({Age})");
    }
}

class Program
{
    static void Main()
    {
        var p1 = new Person("Ayşe");
        var p2 = new Person("Fatma", 25);

        p1.Print(); // Ayşe (0)
        p2.Print(); // Fatma (25)
    }
}

TL;DR

  • Constructor: Nesne oluşturulurken çalışır, başlangıç değerlerini atar.
  • Destructor: Nesne bellekten silinmeden önce çağrılır, çoğunlukla gerekmez çünkü GC yönetir.
  • this: Mevcut nesneyi temsil eder; property–parametre ayrımı, method chaining ve constructor çağırmada kullanılır.