Menu
Coddy logo textTech

Using vs. Try-Finally

Coddy'nin C# Journey'sinin Mantık & Akış bölümünün bir parçası — ders 28 / 66.

Hem using ifadeleri hem de try-finally blokları, düzgün bir şekilde elden çıkarılması gereken kaynakları yönetmeye yardımcı olur. using ifadesi, IDisposable nesnelerin düzgün bir şekilde temizlenmesini sağlamak için daha temiz ve daha özlü bir yol sağlar.

Önce bir try-finally yaklaşımına bakalım. Burada, StreamReader bir dosyadan metin okuyan bir sınıftır — açık bir dosya tutamacı tutar, ki bu işimiz bittiğinde serbest bırakılması gereken bir kaynaktır:

StreamReader reader = null;
try
{
    reader = new StreamReader("file.txt");
    string content = reader.ReadToEnd();
    Console.WriteLine(content);
}
finally
{
    if (reader != null)
    {
        reader.Dispose();
    }
}

finally bloğu, try bloğu içinde bir istisna oluşsa bile Dispose() çağrılarak dosya tutamacının serbest bırakılmasını garanti eder.

using ifadesi bu kalıbı basitleştirir. Parantezler içinde kaynağı tanımlar ve başlatır ve blok sona erdiğinde — ister normal ister bir istisna nedeniyle — otomatik olarak Dispose() çağırır:

using (StreamReader reader = new StreamReader("file.txt"))
{
    string content = reader.ReadToEnd();
    Console.WriteLine(content);
}

Bu, yukarıdaki try-finally örneğine eşdeğerdir, ancak daha az tekrar eden kod ile.

using deyimi, blok sonlandığında Dispose() metodunu otomatik olarak çağırır, bir istisna oluşsa bile. Bu, try-finally temizleme desenini değiştirir — değil try-catch. İstisnaları ayrıca işlemek istiyorsanız, bir using bloğunu hâlâ bir try-catch içine sarabilirsiniz.

challenge icon

Görev

Kolay

processFile adında bir metot oluşturun ki:

  1. Bir string parametre olarak dosya adını alır
  2. Dosyadaki tüm satırları okumak için StreamReader ile using ifadesini kullanır
  3. Dosyadaki satır sayısını döndürür
  4. Eğer bir FileNotFoundException oluşursa, "File not found" yazdırın ve -1 döndürün

Kopya kağıdı

using deyimi, IDisposable nesneleri için otomatik kaynak temizliği sağlar, istisnalar oluşsa bile Dispose() çağrıldığından emin olur. Bu, ayrıntılı try-finally desenini değiştirir.

Try-finally yaklaşımı:

StreamReader reader = null;
try
{
    reader = new StreamReader("file.txt");
    string content = reader.ReadToEnd();
    Console.WriteLine(content);
}
finally
{
    if (reader != null)
    {
        reader.Dispose();
    }
}

Using deyimi (daha temiz yaklaşım):

using (StreamReader reader = new StreamReader("file.txt"))
{
    string content = reader.ReadToEnd();
    Console.WriteLine(content);
}

Her iki yaklaşım da blok sona erdiğinde Dispose() çağrıldığından emin olur. using deyimi bunu otomatik olarak yönetir, manuel null kontrolü ve finally bloğuna olan ihtiyacı ortadan kaldırır.

Önemli noktalar:
using, try-finally'yi değiştirir — try-catch'i değil
try-catch, istisnaları işlemek için hala using ile birleştirilebilir
StreamReader metin dosyalarını okur ve IDisposable'ı uygular, bu da onu using ile kullanım için ideal kılar

Kendin dene

using System;
using System.IO;

class ProcessFile
{
    public static int processFile(string filename)
    {
        // Kodunuzu buraya yazın
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Mantık & Akış bölümündeki tüm dersler