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ü uygular; bu da uygun kaynak yönetimini kolay ve güvenilir hâle getirir.

challenge icon

Görev

Kolay

IDisposable 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: DatabaseConnection ad alanında DataAccess uygulayan bir IDisposable sı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ışsa Connection closed: {ConnectionName} yazdıracak şekilde uygulamalı (çift serbest bırakmayı önlemeli)
    • Query(string sql) döndüren bir Executing on {ConnectionName}: {sql} yöntemine sahip olmalı
  • Program.cs: Ana dosyanızda, veritabanı bağlantınızla birlikte using ifadesini 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çin using bloğ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: MainDB

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