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).