SORU
1 Aralık 2008, PAZARTESİ


Beri .NET bir çöp toplayıcı vardır neden sonlandırıcı/yıkıcı/-desen kurtulabiliriz?

Doğru anladıysam .net çalışma zamanı hep peşime temizler. Yeni nesneler oluşturmak ve ben Şifremi onları başvuran durdurmak, zamanı bu nesneleri temizlemek ve onlar işgal altındaki bellek ücretsiz.

Çünkü bu durumda o zaman neden bazı nesneleri ya da yıkıcı bir yöntem var atmanız gerekiyor mu? Çalışma zamanı, artık başvurulan olmadığı zaman onları sonra temizlemek değil mi?

CEVAP
1 Aralık 2008, PAZARTESİ


Sonlandırıcı kıt kaynakları serbest sisteme geri garanti kolları, yuva, çekirdek nesneler, vb gibi dosya ihtiyaç vardır. Sonlandırıcısı her zaman nesnelerin ömrünün sonunda çalışan bu yana, bu işler serbest bırakmak için belirlenmiş yer.

Dispose desen kaynakların deterministik imha sağlamak için kullanılır. Yana .net çalışma zamanı çöp toplayıcı belirli olmayan (anlamına gelir emin olun asla ne zaman zamanı olacak toplamak eski nesneleri ve çağrı sonlandırıcı), bir yöntem olduğunu gerekli sağlamak deterministik serbest sistem kaynakları. Bu nedenle, ne zaman uygulamak Dispose deseni düzgün sağlamak deterministik yayın kaynakları ve durumlarda tüketici olduğunu ve dikkatsiz değil imha nesne, sonlandırıcı edecek kadar temiz nesne.

Dispose tabi neden basit bir örnek hızlı ve kirli günlük bir yöntem olabilir:

public void Log(string line)
{
    var sw = new StreamWriter(File.Open(
        "LogFile.log", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None));

    sw.WriteLine(line);

    // Since we don't close the stream the FileStream finalizer will do that for 
    // us but we don't know when that will be and until then the file is locked.
}

Yukarıdaki örnekte, dosya çöp toplayıcı StreamWriter nesnenin sonlandırıcı aramaları kadar kilitli kalacak. Bu arada, bu yöntem yine bir günlük yazmak için aramış olabilir, çünkü bu bir sorun yaratabilir, fakat bu sefer dosya hala kilitli olduğu için başarısız olur.

Doğru yolu kullanarak bittiğinde nesne imha etmek için

public void Log(string line)
{
    using (var sw = new StreamWriter(File.Open(
        "LogFile.log", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))) {

        sw.WriteLine(line);
    }

    // Since we use the using block (which conveniently calls Dispose() for us)
    // the file well be closed at this point.
}

BTW, teknik olarak sonlandırıcı ve yıkıcılar demek aynı şey; ben demeyi tercih ediyorum c# yıkıcılar 'sonlandırıcı' beri aksi bir eğilim karıştırmak insanlarla C yıkıcılar, aksine C#, deterministik.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • A Alkhaldi

    A Alkhaldi

    12 Mayıs 2007
  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007
  • wwjoshdu

    wwjoshdu

    18 ŞUBAT 2011