10 Mart 2012 Cumartesi

C# ile Using

Merhaba değerli Webkolog.net takipçileri, bugünkü yazımızda C# programlama dilinin önemli ve sıklıkla kullanılan ifadelerinden biri olan using deyimini yakından inceleyeceğiz. .NET Framework 4 ile birlikte gelen bu yapı, özellikle harici kaynaklarla (dosyalar, veritabanı bağlantıları, ağ kaynakları vb.) çalışırken kaynakların doğru ve zamanında serbest bırakılmasını garanti altına alarak uygulamalarımızın daha güvenilir ve performanslı olmasını sağlar. Gelin, using ifadesinin ne anlama geldiğine ve nasıl kullanıldığına birlikte göz atalım.

using Deyiminin Temel Amacı: Kaynakların Serbest Bırakılması

Uygulamalarımızda dosya okuma/yazma işlemleri yaparken, veritabanına bağlanırken veya diğer yönetilmeyen kaynakları kullanırken, bu kaynakların işimiz bittikten sonra mutlaka serbest bırakılması gerekir. Aksi takdirde, sistem kaynakları gereksiz yere meşgul edilir ve bu durum uygulamanın performansını olumsuz etkileyebilir, hatta kaynak tükenmesine yol açabilir.

İşte tam da bu noktada using deyimi devreye girer. using bloğu, belirli bir kaynak nesnesinin kullanım ömrünü tanımlar ve blok sona erdiğinde bu nesnenin otomatik olarak serbest bırakılmasını (dispose edilmesi) sağlar. Bu sayede, kaynak sızıntısı (resource leak) gibi hataların önüne geçilmiş olur.

IDisposable Arayüzü ve using İlişkisi

using deyimi, yalnızca System.IDisposable arayüzünü implemente eden nesnelerle birlikte kullanılabilir. Bu arayüz, bir nesnenin kullandığı yönetilmeyen kaynakları serbest bırakmak için bir Dispose() metodu tanımlar. .NET Framework'teki birçok sınıf (örneğin Stream, StreamReader, StreamWriter, SqlConnection, SqlCommand vb.) IDisposable arayüzünü implemente eder.

using Deyiminin Söz Dizimi ve Kullanımı

using deyiminin temel söz dizimi şu şekildedir:

using (KaynakTipi kaynakNesnesi = new KaynakTipi(...))
{
    // Kaynak nesnesiyle yapılacak işlemler
}
// using bloğu sona erdiğinde kaynakNesnesi.Dispose() otomatik olarak çağrılır

Burada:

  • KaynakTipi: Kullanılacak kaynağın türünü belirtir (örneğin StreamWriter).
  • kaynakNesnesi: Oluşturulan kaynak nesnesine verilen bir değişkendir (örneğin sw).
  • new KaynakTipi(...): Kaynak nesnesinin oluşturulma işlemidir.
  • { ... }: using bloğu, kaynak nesnesiyle yapılacak işlemleri içeren kod bloğudur.

Örnek: Dosyaya Yazma İşlemi

Sizin de örneğinizde belirttiğiniz gibi, bir dosyaya yazı yazma işlemi sırasında StreamWriter sınıfını kullanırken using deyimi şu şekilde kullanılır:

using System.IO;
 
string path = "dosya.txt";
 
using (StreamWriter sw = File.CreateText(path))
{
    sw.WriteLine("Merhaba");
    sw.WriteLine("Webkolog");
    sw.WriteLine("Okurları");
}
// using bloğu sona erdiğinde sw.Dispose() otomatik olarak çağrılır ve dosya kapatılır

Bu örnekte, File.CreateText(path) metodu ile bir StreamWriter nesnesi oluşturulur ve bu nesne sw değişkenine atanır. using bloğu içinde dosyaya yazma işlemleri gerçekleştirilir. Blok sona erdiğinde, sw nesnesinin Dispose() metodu otomatik olarak çağrılır ve dosya güvenli bir şekilde kapatılır. Hata oluşsa bile (örneğin dosya yazma sırasında bir istisna fırlatılsa bile), Dispose() metodu yine de çağrılacak ve kaynak serbest bırakılacaktır.

Neden using Kullanmalıyız?

using deyimini kullanmanın başlıca avantajları şunlardır:

  • Kaynakların Garantili Serbest Bırakılması: using bloğu sona erdiğinde Dispose() metodu otomatik olarak çağrıldığı için, kaynakların açık unutulma riski ortadan kalkar.
  • Kodun Daha Okunabilir Olması: Kaynak yönetimi ile ilgili kod (try-finally blokları) yerine daha sade ve anlaşılır bir yapı sunar.
  • Hata Yönetimini Kolaylaştırması: İstisnalar oluşsa bile finally bloğunun (örtülü olarak using içinde bulunur) çalışmasını garanti ederek kaynakların temizlenmesini sağlar.
  • Performansı Artırması: Gereksiz yere açık kalan kaynakların sistem üzerindeki yükünü azaltarak uygulamanın daha verimli çalışmasına katkıda bulunur.

using ve try-finally İlişkisi

Aslında using deyimi, arka planda bir try-finally bloğu ile benzer bir işlevi görür. Yukarıdaki StreamWriter örneği, derleyici tarafından kabaca aşağıdaki gibi bir yapıya dönüştürülür:

StreamWriter sw = File.CreateText(path);
try
{
    sw.WriteLine("Merhaba");
    sw.WriteLine("Webkolog");
    sw.WriteLine("Okurları");
}
finally
{
    if (sw != null)
    {
        sw.Dispose();
    }
}

Gördüğünüz gibi, using deyimi kaynak yönetimini çok daha basit ve okunabilir bir hale getirir.

Birden Fazla Kaynağın using ile Yönetimi

Birden fazla using kullanım örneği aşağıdaki gibidir:

using(StreamReader sr = newStreamReader("dosya1.txt")
using(StreamWriter sw = StreamWriter("dosya2.txt")
{
    stringsatir = sr.ReadLine();
    sw.WriteLine(satir);
}
// sr.Dispose() ve sw.Dispose() otomatik olarak çağrılır

Evet sevgili Webkolog.net okurları, bu yazımızda C# .NET Framework 4 ile using deyiminin önemini ve nasıl kullanıldığını detaylı bir şekilde inceledik. Kaynak yönetimi, sağlam ve güvenilir uygulamalar geliştirmenin temel taşlarından biridir ve using deyimi bu konuda bize büyük kolaylık sağlar. Uygulamalarınızda harici kaynaklarla çalışırken using ifadesini kullanarak kaynak sızıntısı riskini en aza indirebilir ve daha performanslı kodlar yazabilirsiniz. Bir sonraki yazımızda, .NET Framework'teki diğer önemli dil özelliklerini keşfetmeye devam edeceğiz.

Webkolog'u takipte kalın!

Hepinize kaynakları doğru yönettiğiniz ve başarılı projeler geliştirdiğiniz günler dilerim!

 

0 yorum:

Yorum Gönder