IDisposable ve using İfadesi
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 45 / 70.
Bazı nesneler, çöp toplayıcının (garbage collector) otomatik olarak temizleyemediği kaynakları - dosya tanıtıcıları, veritabanı bağlantıları, ağ soketleri - tutar. IDisposable arayüzü, bu kaynaklarla işiniz bittiğinde onları serbest bırakmak için standart bir yol sağlar.
Bir sınıf, bir Dispose() metodu sağlayarak IDisposable arayüzünü uygular:
public class FileHandler : IDisposable
{
private bool disposed = false;
public void Dispose()
{
if (!disposed)
{
Console.WriteLine("Releasing resources...");
disposed = true;
}
}
}Dispose() metodunu manuel olarak çağırabilirsiniz, ancak o satıra ulaşmadan önce bir istisna oluşursa ne olur? using ifadesi, işler ters gitse bile temizleme işleminin gerçekleşmesini garanti eder:
using (FileHandler handler = new FileHandler())
{
// İşleyici ile çalışın
} // Dispose() burada otomatik olarak çağrılırModern C#, nesne kapsam dışına çıktığında onu serbest bırakan using bildirimi ile daha temiz bir söz dizimi sunar:
void ProcessFile()
{
using FileHandler handler = new FileHandler();
// handler ile çalış
} // Metottan çıkıldığında Dispose() çağrılırusing ifadesi, IDisposable arayüzünü uygulayan her türle çalışır. StreamReader, SqlConnection ve HttpClient gibi yerleşik sınıfların tümü bu arayüzü uygular; bu da düzgün kaynak yönetimini basit ve güvenilir hale getirir.
Görev
KolayIDisposable arayüzünü ve using ifadesini kullanarak düzgün kaynak yönetimini gösteren bir veritabanı bağlantı simülatörü oluşturalım. Bağlantıların ne zaman açılıp kapandığını izleyen ve kaynakların her zaman düzgün bir şekilde serbest bırakılmasını sağlayan bir sınıf oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
DatabaseConnection.cs:DataAccessad alanı (namespace) içindeIDisposablearayüzünü uygulayan birDatabaseConnectionsınıfı oluşturun. Bağlantınız şunları yapmalıdır:- Yapıcı metot (constructor) aracılığıyla ayarlanan bir
ConnectionNameözelliğine (string, salt okunur) sahip olmalıdır - Özel bir boolean alan kullanarak bağlantının atılıp atılmadığını (disposed) takip etmelidir
- Nesne oluşturulduğunda (yapıcı metot içinde)
Connection opened: {ConnectionName}yazdırmalıdır Dispose()metodunu,Connection closed: {ConnectionName}yazdıracak şekilde uygulamalıdır - ancak bu sadece daha önce atılmamışsa yapılmalıdır (çift atılmayı önlemek için)Executing on {ConnectionName}: {sql}değerini döndüren birQuery(string sql)metoduna sahip olmalıdır
- Yapıcı metot (constructor) aracılığıyla ayarlanan bir
Program.cs: Ana dosyanızda, veritabanı bağlantınızla birlikteusingifadesini kullanarak düzgün kaynak yönetimini gösterin. Bir bağlantı oluşturun, bir sorgu çalıştırın ve temizleme işleminiusingbloğunun otomatik olarak halletmesine izin verin.
İki girdi alacaksınız:
- Bağlantı adı (örneğin,
MainDB) - Çalıştırılacak SQL sorgusu (örneğin,
SELECT * FROM Users)
Bağlantınızı oluşturmak için bir using ifadesi kullanın. Blok içinde Query metodunu çağırın ve sonucunu yazdırın. using bloğu sona erdiğinde, Dispose() otomatik olarak çağrılacaktır.
Örneğin, girdiler MainDB ve SELECT * FROM Users ise, çıktı şu şekilde olmalıdır:
Connection opened: MainDB
Executing on MainDB: SELECT * FROM Users
Connection closed: MainDBusing bloğu bittiğinde bağlantının nasıl otomatik olarak kapatıldığına dikkat edin - Dispose() metodunu manuel olarak çağırmayı asla hatırlamak zorunda kalmazsınız. Bu desen, blok içinde bir istisna (exception) oluşsa bile kaynakların her zaman temizlenmesini sağlar!
Kopya kağıdı
IDisposable arayüzü, çöp toplayıcının (garbage collector) otomatik olarak temizleyemediği kaynakları (dosya tanıtıcıları, veritabanı bağlantıları, ağ soketleri) serbest bırakmak için standart bir yol sağlar.
Bir sınıf, bir Dispose() metodu sağlayarak IDisposable arayüzünü uygular:
public class FileHandler : IDisposable
{
private bool disposed = false;
public void Dispose()
{
if (!disposed)
{
Console.WriteLine("Releasing resources...");
disposed = true;
}
}
}using ifadesi, istisnalar oluşsa bile temizleme işleminin otomatik olarak gerçekleşmesini garanti eder:
using (FileHandler handler = new FileHandler())
{
// İşleyici ile çalışın
} // Dispose() burada otomatik olarak çağrılırModern C#, using bildirimi ile daha temiz bir sözdizimi sunar:
void ProcessFile()
{
using FileHandler handler = new FileHandler();
// İşleyici ile çalışın
} // Metottan çıkıldığında Dispose() çağrılırusing ifadesi, StreamReader, SqlConnection ve HttpClient gibi yerleşik sınıflar da dahil olmak üzere IDisposable arayüzünü uygulayan her türle çalışır.
Kendin dene
using System;
using DataAccess;
class Program
{
public static void Main(string[] args)
{
string connectionName = Console.ReadLine();
string sqlQuery = Console.ReadLine();
// TODO: Bir DatabaseConnection oluşturmak için 'using' ifadesini kullanın
// Using bloğunun içinde:
// 1. sqlQuery ile Query metodunu çağırın
// 2. Query metodunun sonucunu yazdırın
// Using bloğu sona erdiğinde Dispose metodu otomatik olarak çağrılacaktır
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci Kayıtları