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.
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
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
@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