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ü implements eder; bu da uygun kaynak yönetimini kolay ve güvenilir hâle getirir.
Görev
KolayIDisposable arabirimini ve using ifadesini kullanarak uygun 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 always uygun şekilde serbest bırakılmasını sağlayan bir sınıf oluşturacaksın.
Kodunu iki dosyaya ayıracaksın:
DatabaseConnection.cs:DataAccessnamespace'i içindeIDisposableimplements eden birDatabaseConnectionsınıfı oluştur. Bağlantın şunları yapmalı:- constructor aracılığıyla ayarlanan bir
ConnectionNameproperty’sine (string, salt okunur) sahip olmalı - Bağlantının private boolean field kullanılarak disposal edilip edilmediğini izlemeli
- Nesne oluşturulduğunda (constructor içinde)
Connection opened: {ConnectionName}yazdırmalı Dispose()method'unu, yalnızca zaten disposal edilmemişseConnection closed: {ConnectionName}yazdıracak şekilde Implement etmeli (double-disposal'ı prevent etmek için)Executing on {ConnectionName}: {sql}döndüren birQuery(string sql)method'una sahip olmalı
- constructor aracılığıyla ayarlanan bir
Program.cs: Ana dosyanda, veritabanı bağlantınlausingifadesini kullanarak uygun kaynak yönetimini göster. Bir bağlantı oluştur, bir sorgu yürüt ve cleanup işlemini using block'unun otomatik olarak gerçekleştirmesine izin ver.
İki girdi alacaksın:
- Bağlantı adı (ör.
MainDB) - Yürütülecek SQL sorgusu (ör.
SELECT * FROM Users)
Bağlantını oluşturmak için bir using ifadesi kullan. block içinde Query method'unu çağır ve sonucunu yazdır. using block'u ends, Dispose() automatically 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 block'u ends bağlantının automatically olarak closed edildiğine dikkat et - Dispose() method'unu manuel olarak çağırmayı hatırlamak zorunda kalmazsın. Bu düzen, block içinde bir istisna oluşsa bile kaynakların always 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