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 okurReadLine()— her seferinde bir satır okur, dosyanın sonuna ulaşıldığındanulldö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");
}
Görev
KolayŞu işlemleri gerçekleştiren processFile adında bir metot oluşturun:
- Parametre olarak string türünde bir dosya adı alır
- Dosyadaki tüm satırları okumak için
StreamReaderile birlikteusingifadesini kullanır - Dosyadaki satır sayısını döndürür
- Eğer bir
FileNotFoundExceptionoluş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
}
}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
1Multi-dimensional Arrays
2D Arrays BasicsDeclaring and Initializing 2DAccessing 2D Array ElementsNested Loops with 2D ArraysJagged ArraysCommon Matrix OperationsRecap - Multi-dimensional4Flow Control Techniques
Early ReturnsGuard ClausesJump Statements (goto)Break and ContinueFlatten Nested Conditionals7Logical Operators Advanced
Short-Circuit EvaluationConditional Logical OperatorsOperator PrecedenceRecap - Advanced Operators2Advanced Decision Making
Multiple ConditionsComplex Boolean LogicIf vs. Switch ComparisonNested Switch StatementsRecap - Advanced Decisions5Exception Handling
Try-Catch BasicsException TypesMultiple Catch BlocksWorking with FilesFinally BlockUsing vs. Try-FinallyCustom ExceptionsRecap - Error Handling3Loop Enhancements
Loop PerformanceIterating ComplexEach Loop TypeRefactoring LoopsRecap - Optimized Loops6Null Handling
Null Reference BasicsNullable Value TypesNull Checking PatternsDefensive ProgrammingRecap - Null Safety