2012-04-19 23 views
31

here ve here numaralı yanıtlarda önerilen zayıf referansları kullanan bir IDictionary aramamda kısa bir süre önce ConditionalWeakTable<TKey,TValue> sınıfına rastladım. Derslere bulabilirsinizConditionalWeakTable <TKey, TValue> derleyici olmayan amaçlar için mi kullanılmalıdır?

... System.Runtime.CompilerServices ad:

sınıf tanıttı ve devletler hangi a definitive MSDN article yoktur. CompilerServices'te, genel amaçlı bir sözlük türü olmadığı için: sadece derleyici yazarlar tarafından kullanılmasını istiyoruz. Daha sonra yeniden

ve: Kendi ve ihtiyaç duyulduğu bir .NET dili yazıyorsanız

... şartlı zayıf tablo genel amaçlı koleksiyonunu olması amaçlanmıştır ... Ama değil Nesneleri özelliklerine ekleme yeteneğini açığa çıkarmak için kesinlikle Koşullu Zayıf Tabakaya bakmanız gerekir.

Buna paralel olarak, sınıfın MSDN giriş açıklaması okur:

dinamik yönetilen nesnelere nesne alanları takmak için derleyiciler sağlar. DLR yardım etmek ve System.Runtime.CompilerServices ad bu somutlaştırır -

Yani belli başlangıçta çok özel bir amaç için oluşturulmuştur. Ancak, CLR içinde bile bundan daha geniş bir kullanım alanı bulmuş gibi görünüyor. Ben ILSpy içinde ConditionalWeakTable referansları ararsanız, örneğin, bunu diğerleri arasında, MEF sınıfta CatalogExportProvider ve iç WPF DataGridHelper sınıfta kullanılan görebilirsiniz.

Sorunun, derleyici yazı ve dil araçlarının dışında ConditionalWeakTable'un kullanılmasının uygun olup olmadığı ve gelecekteki .NET sürümlerinde önemli ek yüklerin veya uygulamaların önemli ölçüde değiştirilmesinde herhangi bir risk olup olmadığıdır. (Ya da kaçınılmalıdır ve bunun yerine this one gibi özel bir uygulama kullanılmalıdır).

ayrıca ConditionalWeakTable anahtarlar ve değerler arasındaki devir sorunla başa çıkmak için ephemerons (System.Runtime.Compiler.Services. DependentHandle yoluyla) gizli bir CLR uygulaması kullanır ve nasıl bu kolaylıkla başarılı olamaz hakkında here, here ve here okuma vardır özel bir şekilde.

cevap

22

ConditionalWeakTable ile ilgili yanlış bir şey göremiyorum. Ephemeron'lara ihtiyacınız varsa, başka seçeneğin yok.

gelecekteki .NET versiyonları bir sorun olacağını sanmıyorum - sadece derleyiciler bu sınıfı kullanmak istiyorsunuz bile, Microsoft hala mevcut ikili uyumluluk kırmadan bunu değiştirmek olamazdı.

Genel giderle ilgili olarak - normal bir Sözlüğe kıyasla kesinlikle havai olacaktır. Pek çok DependentHandle s'ye sahip olmak, muhtemelen WeakReference s 'nin normal referanslardan daha pahalı olmasıyla benzer bir şekilde pahalı olacaktır (GC'nin null atılmaları gerekip gerekmediğini görmek için bunları taramak için ek çalışma yapması gerekir). Fakat bu, pek çok (milyonlarca) girişiniz olmadığı sürece sorun değil.

+0

Teşekkürler, bunu cevap olarak işaretleyeceğim. Bence haklısın - Zayıf referanslar kullanan bir Sözlük istiyorum, bu yüzden ConditionalWeakTable, ephemeron kullanmanın ek faydası ile zayıf referanslar kullanan herhangi bir diğer uygulamaya kıyasla daha fazla yük getirmemelidir. – Riko

+0

ConditionalWeakTable'ın kullanılabilirliğinden gerçekten heyecan duyuyordum, ancak şu belgede dikkatimi çektim: "Bir anahtar için karma kodunu açıkça ayarlamak için Object.GetHashCode'u geçersiz kılarak eşitlik karşılaştırmasını denetleyemezsiniz. ConditionalWeakTable sınıfı karma kodları hesaplamak için Object.GetHashCode yöntemini kullanın ve bu nedenle Object.GetHashCode geçersiz kılmaları çağırmaz. " - Benim amacım için yararlı değil. :( – ctrlplusb

+6

@Sean: 'ConditionalWeakTable' anahtarlar için referans kimliğinden başka bir şey kullanmanın bir yolu yoktur, çünkü bu kodun bir anahtarın tedarik edilmesinin mümkün olmadığı zamanın bilmesi imkansızdır (Durma Sorunu). koleksiyondaki bir öğeyle eşleşmelidir. – supercat