Menu
Coddy logo textTech

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ır

Modern 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ır

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

challenge icon

Görev

Kolay

IDisposable 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: DataAccess ad alanı (namespace) içinde IDisposable arayüzünü uygulayan bir DatabaseConnection sı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 bir Query(string sql) metoduna sahip olmalıdır
  • Program.cs: Ana dosyanızda, veritabanı bağlantınızla birlikte using ifadesini kullanarak düzgün kaynak yönetimini gösterin. Bir bağlantı oluşturun, bir sorgu çalıştırın ve temizleme işlemini using bloğ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: MainDB

using 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ır

Modern 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ır

using 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
        
    }
}
quiz iconKendini test et

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