SORU
22 ŞUBAT 2009, Pazar


Vs null bir nesne İmha ayarı()

CLR ve GC işler böyle hayran am (C) CLR okuyarak bu konuda bilgimi genişletmeye çalışıyorum# Jon Skeet kitapları/mesajlar, ve daha fazla).

Her neyse, ne söylemek arasında fark vardır:

MyClass myclass = new MyClass();
myclass = null;

Ya da, Sınıfım IDisposable ve yıkıcı uygulamak yapım ve İmha arayarak()?

Ayrıca, eğer ben bir kod bloğu ile bir ifade kullanarak (örnek aşağıda), eğer benim adım kod ve çıkış kullanarak bir blok ötedeki nesneyi bertaraf sonra ya da ne zaman bir çöp toplama oluşur? Eğer Atın derim ne olur() kullanarak blok anyay?

using (MyDisposableObj mydispobj = new MyDisposableObj())
{

}

Stream sınıfları (örneğin BinaryWriter) bir Finalize yöntemi var mı? Neden kullanmak isteyeyim?

CEVAP
22 ŞUBAT 2009, Pazar


Önemli çöp toplama elden çıkarma ayrı. Tamamen ayrı şeyler, bir dakika içinde geliyorum hangi ortak bir noktası vardır.

Dispose, çöp toplama ve sonuçlandırılması

Yazdığında using ifadesi, sadece sözdizimsel şeker için bir try/finally bloğu Dispose adı bile kod vücudun using deyim, bir istisna atar.yoknesne bloğu sonunda çöp toplanır.

İmha ile ilgiliyönetilmeyen kaynakları(non-bellek kaynakları). Bu kolları, ağ bağlantıları, dosya vb işler UI olabilir. Bu sınırlı kaynakları, genelde onları en kısa sürede serbest bırakmak istiyorum. Gerekir uygulamak IDisposable her tip "sahibi" yönetilmeyen bir kaynak, ya doğrudan (genellikle) IntPtr) veya dolaylı olarak (örneğin) Stream SqlConnection vs.).

Çöp toplama küçük bir bükülme ile bellek hakkında kendisidir. Çöp toplayıcısı artık başvurulan nesneleri bulmak ve onları ücretsiz. İhtiyacı olduğunu algılarsa bir "yığın bellek çalışır) nesil. (örneğin sadece çöp için her zaman olsa bak - yok

Twistsonuçlandırılması. Çöp toplayıcısı artık ulaşılabilir olan, ama bir sonlandırıcı var olan nesnelerin listesini tutar (C ~Foo() olarak yazılmış#, biraz karışacak - C yıkıcılar gibi değiller). Onların anısına serbest önce ekstra bir temizlik yapmak için ihtiyacınız olan her durumda bu nesnelerin sonlandırıcı ile çalışır.

Sonlandırıcı hemen hemen her zaman, düzenli bir şekilde yazın kullanıcı atmanız unutmuş durumda, kaynakları temizlemek için kullanılır. Yani FileStream bir açık ama Dispose Close sonlandırıcı aramak için unutursanızsonundaalttaki dosyayı sizin için kolu serbest bırakın. İyi yazılmış bir programda, sonlandırıcı neredeyse hiç bence ateş gerekir.

null bir değişken ayarı

null - Bu bir değişken ayar üzerinde küçük bir nokta neredeyse hiç çöp toplama iyiliği için gereklidir. Bazen benim deneyim, "" artık gerekli bir nesne. bölüm için nadir olsa da eğer bir üye değişkeni varsa bunu yapmak isteyebilirsiniz Yerel bir değişken olduğunda, JİT genellikle zekidir (serbest modunda) başvuru tekrar kullanmak için gidiyoruz değil ne zaman bilmek. Örneğin:

StringBuilder sb = new StringBuilder();
sb.Append("Foo");
string x = sb.ToString();

// The string and StringBuilder are already eligible
// for garbage collection here!
int y = 10;
DoSomething(y);

// These aren't helping at all!
x = null;
sb = null;

// Assume that x and sb aren't used here

Nerede bir zamanolabilirdeğer ayarı bir yerel değişken null ne zaman sen bir döngü, ve bazı dalları döngü kullanmaya ihtiyaç değişken ama biliyorsun aradığınız bir noktada ki yok. Örneğin:

SomeObject foo = new SomeObject();

for (int i=0; i < 100000; i  )
{
    if (i == 5)
    {
        foo.DoSomething();
        // We're not going to need it again, but the JIT
        // wouldn't spot that
        foo = null;
    }
    else
    {
        // Some other code 
    }
}

IDisposable/sonlandırıcı uygulanması

Kendi türleri sonlandırıcı uygulamak gerekir? Kesinlikle hayır. Eğer sadecedolaylı olaraktutun yönetilmeyen kaynakları (örn: var FileStream gibi bir üye değişken) ekleyerek kendi sonlandırıcı yaramaz: akış olacak neredeyse kesin olması için uygun çöp toplama ne zaman bir nesne olsun, sadece güvenmek FileStream sahip bir sonlandırıcı (eğer gerekli olabilir başvurmak için başka bir şey, vb.). Eğer tutmak ister yönetilmeyen bir kaynak "neredeyse" doğrudan SafeHandle arkadaşın alır biraz zaman almak için gidiyor, ama bunun anlamı ulaşabilirsiniz almost never need to write a finalizer again. Genellikle sadece eğer gerçekten doğrudan bir kaynak (IntPtr) kolu eğer bir sonlandırıcı gerekir ve SafeHandle mümkün olduğunca çabuk hareket etmelisiniz. (İki link. - iki, ideal olarak okunur.)

Joe Duffy okumaya değer very long set of guidelines around finalizers and IDisposable (akıllı halk sürü co-yazılı). Değerinin farkında olan mühür sınıfları, hayat çok daha kolay: desen geçersiz kılma Dispose arayıp yeni bir sanal Dispose(bool) yöntem vb sadece ilgili dersin ne zaman olduğunu tasarlanmış için miras.

Bu bir ramble biraz olmuştur, ama bazıları gibi:) istediğiniz açıklama isteyin lütfen

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bigapplemagic

    Bigapplemagi

    22 EYLÜL 2011
  • Megan Parken

    Megan Parken

    19 Temmuz 2009
  • RFS Dan

    RFS Dan

    22 Temmuz 2014