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 otomatik olarak temizleyemeyeceği kaynakları — dosya tanıtıcılarını, veritabanı bağlantılarını, ağ soketlerini — elinde tutar. IDisposable arayüzü, işiniz bittiğinde bu kaynakları serbest bırakmak için standart bir yol sağlar.
Bir sınıf, IDisposable uygulamasını bir Dispose() yöntemi sağlayarak gerçekleştirir:
public class FileHandler : IDisposable
{
private bool disposed = false;
public void Dispose()
{
if (!disposed)
{
Console.WriteLine("Releasing resources...");
disposed = true;
}
}
}Dispose() yöntemini manuel olarak çağırabilirsin, ancak o satıra ulaşmadan önce bir istisna oluşursa ne olur? using ifadesi, işler ters gittiğinde bile temizleme işleminin gerçekleşmesini garanti eder:
using (FileHandler handler = new FileHandler())
{
// handler ile çalış
} // Dispose() burada otomatik olarak çağrılırModern C#, nesne kapsam dışına çıktığında nesneyi serbest bırakan using bildirimiyle daha temiz bir sözdizimi sunar:
void ProcessFile()
{
using FileHandler handler = new FileHandler();
// handler ile çalış
} // Dispose() metot çıktığında çağrılırusing ifadesi, IDisposable uygulayan herhangi bir türle çalışır. StreamReader, SqlConnection ve HttpClient gibi yerleşik sınıfların tümü bu arayüzü uygular; bu da uygun kaynak yönetimini kolay ve güvenilir hâle getirir.
Görev
KolayIDisposable arayüzünü ve using ifadesini kullanarak doğru kaynak yönetimini gösteren bir veritabanı bağlantısı simülatörü oluşturalım. Bağlantıların ne zaman açılıp kapatıldığını izleyen ve kaynakların her zaman düzgün şekilde serbest bırakılmasını sağlayan bir sınıf oluşturacaksınız.
kodunuzu iki dosyaya ayıracaksınız:
DatabaseConnection.cs:DatabaseConnectionad alanındaDataAccessuygulayan birIDisposablesınıfı oluşturun. Bağlantınız şunları yapmalıdır:- Oluşturucu aracılığıyla ayarlanan bir
ConnectionNameözelliğine (string, yalnızca okunabilir) sahip olmalı - Özel bir boolean alan kullanarak bağlantının serbest bırakılıp bırakılmadığını izlemeli
- Nesne oluşturulduğunda (oluşturucuda)
Connection opened: {ConnectionName}yazdırmalı Dispose()yöntemini, yalnızca henüz serbest bırakılmamışsaConnection closed: {ConnectionName}yazdıracak şekilde uygulamalı (çift serbest bırakmayı önlemeli)Query(string sql)döndüren birExecuting on {ConnectionName}: {sql}yöntemine sahip olmalı
- Oluşturucu aracılığıyla ayarlanan bir
Program.cs: Ana dosyanızda, veritabanı bağlantınızla birlikteusingifadesini kullanarak doğru kaynak yönetimini gösterin. Bir bağlantı oluşturun, bir sorgu çalıştırın ve temizleme işleminin otomatik olarak gerçekleştirilmesi içinusingbloğunun bunu yönetmesine izin verin.
İki girdi alacaksınız:
- Bağlantı adı (ör.
MainDB) - Çalıştırılacak SQL sorgusu (ör.
SELECT * FROM Users)
Bağlantınızı oluşturmak için bir using ifadesi kullanın. Blok içinde Query yöntemini çağırın ve sonucunu yazdırın. using bloğu sona erdiğinde Dispose() otomatik olarak çağrılı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 sona erdiğinde bağlantının otomatik olarak kapatıldığına dikkat edin; Dispose() yöntemini manuel olarak çağırmayı hatırlamanız gerekmez. Bu desen, blok içinde bir özel durum oluşsa bile kaynakların her zaman temizlenmesini sağlar!
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' ifadesi kullan
// using bloğunun içinde:
// 1. sqlQuery ile Query metodunu çağır
// 2. Query metodunun sonucunu yazdır
// 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ıKendi başına pratik yap: Online C# derleyicisi