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

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

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

challenge icon

Görev

Kolay

IDisposable 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: DataAccess namespace'i içinde IDisposable implements eden bir DatabaseConnection sınıfı oluştur. Bağlantın şunları yapmalı:
    • constructor aracılığıyla ayarlanan bir ConnectionName property’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şse Connection closed: {ConnectionName} yazdıracak şekilde Implement etmeli (double-disposal'ı prevent etmek için)
    • Executing on {ConnectionName}: {sql} döndüren bir Query(string sql) method'una sahip olmalı
  • Program.cs: Ana dosyanda, veritabanı bağlantınla using ifadesini 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: MainDB

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

Kendi başına pratik yap: Online C# derleyicisi