İşlev adından önceki tilde C # 'da ne anlama geliyor?


165

Bazı kodlara bakıyorum ve bu ifade vardır:

~ConnectionManager()
{
    Dispose(false);
}

Sınıf IDisposablearabirimi uygular , ancak bunun tilde (~) için bir parçası olup olmadığını bilmiyorum.

Yanıtlar:


214

~ yıkıcıdır

  1. Yıkıcılar otomatik olarak çağrılır ve açıkça çağrılamaz.
  2. Yıkıcılar aşırı yüklenemez. Böylece, bir sınıf en fazla bir yıkıcıya sahip olabilir.
  3. Yıkıcılar miras alınmaz. Böylece, bir sınıfın içinde ilan edilebilecek hiçbir yıkıcı yoktur.
  4. Yıkıcılar yapılarla kullanılamaz. Sadece sınıflarla kullanılırlar. Herhangi bir kodun örneği kullanması artık mümkün olmadığında, bir örnek imha için uygun hale gelir.
  5. Örneğin imha edicinin yürütülmesi, örneğin imha için uygun hale gelmesinden sonra herhangi bir zamanda gerçekleşebilir.
  6. Bir örnek tahrip edildiğinde, miras zincirindeki yıkıcılara, en çok türetilmiş olandan en az türetilmiş olana doğru sıralanır.

Sonuçlandırmak

C # 'da, Sonlandırma yöntemi standart bir C ++ yıkıcısının yapacağı işlemleri gerçekleştirir. C # 'da bunu sonlandırmazsınız - sınıf adının önüne bir tilde (~) sembolü yerleştirmek için C ++ yıkıcı sözdizimini kullanırsınız.

Elden çıkarmak

Nesneleri , sınıfın kullanıcısı tarafından açıkça çağrılabilen bir Close()veya Dispose()yöntemde atmak tercih edilir . Sonuçlandırma (yıkıcı) GC tarafından çağrılır.

Idisposable arayüzü sınıf tanzim için kaynak üzerine tutar ve kullanıcılara bunları serbest bırakmak için bir yol sağlar dünyaya söyler. Eğer sınıfta bir finalizer uygulamak gerekir yoksa, Dispose yöntemi olmalıdır kullanmak GC.SuppressFinalize()yöntemini örneğinin o sonuçlandırılması bastırılır sağlamak için.

Ne kullanılır?

Bir yıkıcıyı açıkça aramak yasal değildir. Yıkıcınız çöp toplayıcı tarafından çağrılır. Mümkün olduğunca çabuk kapatmak ve atmak istediğiniz değerli yönetilmeyen kaynakları (dosya tanıtıcıları gibi) işlerseniz, IDisposable arabirimini uygulamalısınız.


3
Eskiden nasıl olduğunu bilmiyorum. Ama şimdi yıkıcılar kalıtsaldır. Daha fazla bilgi için bu bağlantıyı kontrol edin (sondaki örneği kontrol edin): msdn.microsoft.com/en-us/library/66x5fx1b.aspx
RononDex

1
@RononDex, bağlantı verdiğiniz sayfanın 3. noktası "Yorumlayıcılar devralınamaz" ifadesiyle belirtilir . Kuşkusuz bu biraz kafa karıştırıcı çünkü miras alınamasa da " Finalizeyöntem miras zincirindeki en çok türetilmiş olandan en az türetilmiş olana kadar tüm örnekler için özyinelemeli olarak çağrılır" . Bununla birlikte , kalıtımsal yıkıcılardan alacağınız davranışın aynı olmadığını unutmayın .
Mark Amery

@MarkAmery ah görüyorum, yani temelde miras alınan bir şeyle karşılaştırıldığında ters sırada çağırılırlar?
RononDex

45

Bu bir sonuçlandırıcı . Dürüst olmak gerekirse, çok nadiren bir finalizer yazmanız gerekir. Gerçekten sadece bir tane yazmanız gerekir:

  • Sen (Bir aracılığıyla örneğin yönetilmeyen bir kaynağa doğrudan erişim IntPtr) ile kullanamazsınız SafeHandlekolaylaştırır hangi
  • IDisposableMühürlü olmayan bir sınıfa uyguluyorsunuz . (Benim tercihim, miras için tasarlanmadığı sürece sınıfları mühürlemektir.) Bir finalizer, bu gibi durumlarda kanonik İmha modelinin bir parçasıdır.

9

Sınıfın yıkıcısını belirtmek için kullanılır.


12
Okuduğunuz C # özelliklerine bağlı olarak ikisi de doğrudur. En son MS olanı (birleşik C # 3.0), onları yıkıcılar olarak ifade eder (örneğin, bölüm 10.13), ancak ECMA spesifikasyonları, bunları sonlandırıcı olarak ifade eder.
Jon Skeet

@ 1800INFORMASYON: Sözdizimsel öğeye uygun şekilde yıkıcı denir. Bir sınıfın bir yıkıcısı varsa, bir C # derleyicisi otomatik olarak try/finallyüst Finalizeyöntemin çağrılmasını sağlayan genel olarak yararsız bir blok içeren bir sonlandırıcı oluşturur . Yıkıcılar için geçerli olan çoğu şey, finalizörler için geçerlidir ve tersi de geçerlidir, ancak kelimeler biraz farklı şeyler ifade eder.
Supercat

4

C ++ ile aynı, yıkıcı; ancak C # 'da bunu açıkça çağırmazsınız, nesne toplandığında çağrılır.



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.