Konu Anlatımı
Nesne Doğarken ve Ölürken Ne Olur?
Her nesnenin işe başlamadan önce hazır hâle getirilmesi gerekir: IP adresi boş string olmamalı, port numarası 0 olmamalı, dosya açıldıysa elinde tuttuğu kaynak kapatılmalıdır. Bu hazırlığı yapan metoda yapıcı (constructor), nesne yok olurken devreye giren özel metoda ise yıkıcı (finalizatör) denir. Yapıcı çağrısı garanti ve senkron bir iştir; yıkıcının ne zaman çalışacağı ise belirsizdir, bu yüzden kritik kaynakların kapatılması yalnızca yıkıcıya bırakılmaz.
1. Yapıcı Metot Kuralları
Yapıcının adı sınıfın adıyla birebir aynıdır ve geri dönüş değeri yoktur. Sınıfta hiçbir yapıcı yazılmazsa derleyici parametreless bir yapıcıyı otomatik üretir; ancak programa bir tane parametreli yapıcı eklenirse otomatik üretim durur ve parametresiz new çağrısı derleme hatası verir. Yapıcı, alanlara ilk değeri atamanın en güvenli yoludur çünkü nesne daha hiçbir kod tarafından kullanılmadan önce durumu tanımlanmış olur.
2. Aşırı Yükleme (Overload)
Aynı sınıf içinde birden fazla yapıcı, parametre listesi farklıysa yan yana yazılabilir. Çağrım sırasında argüman sayısı ve tiplerine bakılarak hangi yapıcının çalışacağı belirlenir. Bu durum nesneyi farklı bilgi seviyelerinde kurma imkânı verir: yalnız model bilgisiyle, ya da model ile IP bilgisi birlikte kurulabilir. Parametreler aynı olup yalnız türleri farklıysa çağırım yine ayrıdır; hiçbiri uymazsa derleme hatası alınır.
3. Yıkıcı, Çöp Toplayıcı ve Kaynaklar
C#'ta yıkıcı, ~SınıfAdı biçiminde yazılır ve çöp toplayıcı (GC) nesnenin bellekten silineceğini anladığında onu çağırır. Bellek yönetimi otomatiktir; buna karşılık dosya tutamacı, ağ soketi, veritabanı bağlantısı ve donanım portu gibi elle yönetilen kaynaklar serbest bırakılmazsa kilit kalır. Bu kaynaklar IDisposable arayüzünü uygular ve Dispose metodu çağrılmalıdır; using bloğu kapanırken bu çağırmayı otomatik yapar.
4. Adım Adım: Kaynağı Güvenle Kullanan Yapıcı
- Sınıfın alanları yazılır: dURUM yerine durumOku, yedekYolu ve acikBaglantiSayisi gibi açık adlar kullanılır.
- Parametreli yapıcıda alanlar doğrulanır ve ilk değer ataması yapılır.
- using System.IO ve using System ile gerekli ad alanları eklenir.
- Yedek dosyası using bloğu içinde açılır, blok kapanınca dosya kilitleri bırakılır.
- Dispose metodu içinde kaynaklar serbest bırakılır, nesne çöp toplayıcıya bırakılır.
5. Sınav ve Saha Odaklı Notlar
Sınavda yapıcının geri dönüş değeri olmadığı, adının sınıf ile aynı olduğu ve parametresiz otomatik yapıcının yalnızca hiçbir yapıcı yazılmadığında üretiltiği sorulur. Ayrıca using bloğunun finally karşılığı olduğu, yani hata çıksa da çıktığın blok içindeki kaynağı kapattığı sıkça sorulur.
Sahada en sık görülen arıza, yedek görevinin dosyayı açık bırakıp kilitlemesidir. Bir yedekleme işi 4 GB'lık bir dosyayı her çalıştırmada açıp kapatmıyorsa bir sonraki görev dosyaya yazamaz; açık bağlantı sayacı ise sorgu başına bir artıp serbest bırakılmazsa bağlantı havuzunu tüketir. Kaynak yönetiminin gözlemlenebilir karşılığı budur.
Ne Öğreneceğiz
Yapıcı metot çeşitleri, aşırı yükleme, finalizatör, çöp toplayıcı ve kaynakların düzenli serbest bırakılmasını anlatan kaynak yönetim konusudur. Bu konuda ögrenme çıktıları:
- Yapıcı metodun görevini ve sınıf adıyla aynı adı taşıma kuralını açıklar.
- Parametreli yapıcı ile nesnenin ilk durumunu doğru kurar.
- Aynı sınıf içinde birden fazla yapıcının (aşırı yükleme) nasıl ayırt edildiğini gösterir.
- Finalizatör ile çöp toplayıcının çalışma biçimini ve farkını değerlendirir.
- IDisposable arayüzü ve using bloğu ile dosya, port ve bağlantıların neden düzenli kapatıldığını gerekçelendirir.
Ön Bilgi
Bu konuya başlamadan önce temel kavram ve ön koşulları kavramanız yardımcı olacaktır. Konunun çerçevesinde şu kavramlar dikkat ister:
- Yapıcı ilk değeri atamanın en güvenli yoludur, nesne kullanılmadan önce durumu tanımlanır.
- Çöp tolayıcı yalnızca belleği yönetir, dosya ve bağlantı gibi elle yönetilen kaynakları kapatmaz.
- Finalizatörün ne zaman çalışacağı garanti edilmez, bu yüzden kritik işler için kullanılmaz.
- using yalnızca IDisposable uygulayan türlerle kullanılır.
- Aşırı yüklenmiş yapıcılarda parametreler aynı olamaz, yoksa çağırım belirsizleşir.
- Dispose çağrıldıktan sonra nesne yeniden kullanılmamalı, yeni nesne üretilmelidir.
Basit Örnek ve Günlük Yaşam
Günlük yaşamda ve mesleki bağlamda bir uygulama:
Soru: Cihaz sınıfında IP adresi ve port numarasının nesne üretilirken atanması isteniyor. Yapıcı nasıl yazılır?
- Adım 1: class Cihaz kalıbı içinde private alanlar ipAdresi ve portNo tanımlanır.
- Adım 2: public Cihaz(string ip, int port) biçiminde yapıcı yazılır, ad sınıfın adıyla aynıdır.
- Adım 3: Yapıcı gövdesinde this.ipAdresi = ip ve this.portNo = port atamaları yapılır.
- Adım 4: new Cihaz(192.168.1.20, 24) çağrısıyla nesne ilk değerleriyle üretilir.
Sonuç/cevap: Cevap: Parametreli yapıcı, alanlara ilk değerleri atar; nesne kullanılmadan önce IP ve port bilgisi hazır hâle gelir.
İleri Örnek
Daha ileri bir uygulama:
Soru: Bir bağlantı havuzu sınıfında 100 sorgu çalıştıran uygulamanın bağlantıları nasıl serbest bırakılmalıdır; yalnız finalizatöre güvenmek neden sakıncalıdır?
- Adım 1: Bağlantının IDisposable uyguladığı ve Dispose metodu bulunduğu belirlenir.
- Adım 2: Sorguların using bloğu içinde çalıştırıldığı, blok sonunda bağlantının serbest bırakıldığı yazılır.
- Adım 3: Finalizatörün çöp toplayıcı tarafından belirsiz bir anda çağrıldığı hatırlanır.
- Adım 4: Belirsiz zamanlama nedeniyle 100 bağlantının aynı anda açık kalabileceği ve havuzun tükenebileceği değerlendirilir.
Sonuç/cevap: Cevap: Bağlantılar using ve Dispose ile kapan anında serbest bırakılmalıdır; finalizatöre bırakmak bağlantı havuzunun dolmasına yol açabilir.
Karşılaştırma Tablosu
| Kavram | Açıklama |
|---|
| Yapıcı ilk değeri atamanın en güvenli yo | Yapıcı ilk değeri atamanın en güvenli yoludur, nesne kullanılmadan önce durumu tanımlanır. |
| Çöp tolayıcı yalnızca belleği yönetir, d | Çöp tolayıcı yalnızca belleği yönetir, dosya ve bağlantı gibi elle yönetilen kaynakları kapatmaz. |
| Finalizatörün ne zaman çalışacağı garant | Finalizatörün ne zaman çalışacağı garanti edilmez, bu yüzden kritik işler için kullanılmaz. |
| using yalnızca IDisposable uygulayan tür | using yalnızca IDisposable uygulayan türlerle kullanılır. |
| Aşırı yüklenmiş yapıcılarda parametreler | Aşırı yüklenmiş yapıcılarda parametreler aynı olamaz, yoksa çağırım belirsizleşir. |
| Dispose çağrıldıktan sonra nesne yeniden | Dispose çağrıldıktan sonra nesne yeniden kullanılmamalı, yeni nesne üretilmelidir. |
Sık Yapılan Hatalar
Yapıcıya void ya da başka dönüş değeri yazmak: Yapıcının geri dönüş değeri yoktur, eklenen dönüş değeri derleme hatasına yol açar.
Parametreli yapıcı ekledikten sonra parametresiz new beklemek: Derleyici otomatik yapıcıyı yalnızca hiçbir yapıcı yokken üretir.
Kaynak kapatmayı yalnızca finalizatöre bırakmak: Finalizatörün zamanı garanti değildir, dosya ve bağlantılar geç kapanır.
using bloğunu kullanmayıp Dispose çağırmayı unutmak: Hata durumunda da kapanması gereken kaynaklar açık kalır ve kilitlenme oluşur.
Aynı parametre listesiyle ikinci yapıcı yazmak: İmzalar aynı olamaz, bu durumda derleyici çakışan tanım hatası verir.
Özet
Bu konuda yapıcı metotların adlandırma ve dönüş değeri kuralları, parametreli yapıcının ilk durumu kurma görevi ve aşırı yüklemede ayırt edicilik ele alındı. Finalizatör ile çöp toplayıcının yalnızca belleği yönettiği, dosya ve bağlantı gibi elle yönetilen kaynakların Dispose ile serbest bırakıldığı ayrıldı. using bloğunun hata durumunda da kaynağı kapattığı, açık bağlantı ve dosya kilitlerinin bu sayede oluşmadığı örneklerle gösterildi.
Kendini Dene
Soru: Bir cihaz sınıfında parametreli yapıcı, finalizatör ve IDisposable arayüzünü uygulayan Dispose metodu birlikte tanımlansın. Kod şemasını hazırla ve her bölümün görevini, finalizatörün ne zaman çalıştığının neden garanti olmadığını açıkla.
Örnek cevap: Puanlama anahtarı: Sınıf adıyla aynı adlı, dönüş değeri olmayan parametreli yapıcı doğru yazılır ve ilk durum orada kurulur (4 puan); ~SınıfAdı biçimindeki finalizatörün çöp toplayıcı tarafından belirsiz zamanda çağrıldığı belirtilir (3 puan); Finalizatörün yalnızca belleği yönetip dosya ve bağlantıları kapatmadığı anlatılır (4 puan); using/Dispose ile kaynakların hata durumunda dahi serbest bırakıldığı açıklanır (4 puan).