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.
Görev
KolayprocessFile adında bir metot oluşturun ki:
- Bir string parametre olarak dosya adını alır
- Dosyadaki tüm satırları okumak için
StreamReaderileusingifadesini kullanır - Dosyadaki satır sayısını döndürür
- Eğer bir
FileNotFoundExceptionoluş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
}
}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