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 uygun şekilde temizlenmesini sağlamanın daha temiz ve kısa bir yolunu sunar.

Not: using, kaynakların serbest bırakılması için kullanılan try-finally deseninin yerini alır. try-catch yapısının yerini almaz. İstisnaları işlemek için bir using bloğunu yine de try-catch içine yerleştirebilirsin.

Öncelikle 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 özel durum oluşsa bile bloktan çıkıldığında Dispose() yöntemini otomatik olarak çağırır.

StreamReader nedir?
StreamReader, dosyalardan metin okumak için kullanılan bir class'tır. Bir filename geçirerek oluşturursun ve dosyayı okuma için açar. IDisposable uygular; bu nedenle kullanımdan sonra düzgün bir şekilde kapatılmalıdır. using tam olarak bunu senin için halleder.

Yaygın StreamReader yöntemleri:

  • ReadToEnd(): dosyanın tamamını 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 ReadLine() döngüsünü kullanabilirsiniz:

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

Eksik bir dosya gibi özel durumları 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

processFile adlı bir metot oluşturun. Bu metot:

  1. string türünde bir parametre olarak filename alır
  2. dosyadaki tüm satırları okumak için using ifadesini ve StreamReader kullanır
  3. dosyadaki satır sayısını döndürür
  4. 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

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