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ı, uygun şekilde serbest bırakılması gereken kaynakların yönetilmesine yardımcı olur. using ifadesi, IDisposable nesnelerinin düzgün bir şekilde temizlenmesini sağlamak için daha temiz ve daha kısa bir yol sunar.

Not: using, kaynakların serbest bırakılması (disposal) için try-finally deseninin yerini alır — try-catch deseninin yerini almaz. İstisnaları işlemek için bir using bloğunu hala bir try-catch içine sarabilirsiniz.

Öncelikle bir try-finally yaklaşımına bakalım:

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

using ifadesi bu kodu basitleştirir:

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

using ifadesi, bir istisna oluşsa bile bloktan çıkıldığında Dispose() metodunu otomatik olarak çağırır.

StreamReader nedir?
StreamReader, dosyalardan metin okumak için kullanılan bir sınıftır. Bir dosya adı geçirerek bir tane oluşturursunuz ve o, dosyayı okumak için açar. IDisposable arayüzünü uygular, bu nedenle kullanımdan sonra düzgün bir şekilde kapatılmalıdır — ki bu tam olarak using ifadesinin sizin için hallettiği şeydir.

Yaygın StreamReader metotları:

  • ReadToEnd() — tüm dosyayı tek bir dize olarak okur
  • ReadLine() — her seferinde bir satır okur, dosyanın sonuna ulaşıldığında null döndürür

Bir dosyadaki satırları saymak için bir ReadLine() döngüsü kullanabilirsiniz:

using (StreamReader reader = new StreamReader("file.txt"))
{
    int lineCount = 0;
    while (reader.ReadLine() != null)
    {
        lineCount++;
    }
    Console.WriteLine(lineCount);
}

Eksik bir dosya gibi istisnaları işlemek için using ifadesini try-catch ile de birleştirebilirsiniz:

try
{
    using (StreamReader reader = new StreamReader("file.txt"))
    {
        int lineCount = 0;
        while (reader.ReadLine() != null)
        {
            lineCount++;
        }
        Console.WriteLine(lineCount);
    }
}
catch (FileNotFoundException)
{
    Console.WriteLine("File not found");
}
challenge icon

Görev

Kolay

Şu işlemleri gerçekleştiren processFile adında bir metot oluşturun:

  1. Parametre olarak string türünde bir dosya adı alır
  2. Dosyadaki tüm satırları okumak için StreamReader ile birlikte 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ır ve -1 döndürür

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