.NET benzersiz nesne tanımlayıcısı
Bir örnek, benzersiz bir tanımlayıcı almanın bir yolu var mı?
GetHashCode()
iki referans aynı örneğe işaret için aynıdır. Ancak, iki farklı örnekleri (çok kolay) aynı karma kodu alabilir:
Hashtable hashCodesSeen = new Hashtable();
LinkedList<object> l = new LinkedList<object>();
int n = 0;
while (true)
{
object o = new object();
// Remember objects so that they don't get collected.
// This does not make any difference though :(
l.AddFirst(o);
int hashCode = o.GetHashCode();
n ;
if (hashCodesSeen.ContainsKey(hashCode))
{
// Same hashCode seen twice for DIFFERENT objects (n is as low as 5322).
Console.WriteLine("Hashcode seen twice: " n " (" hashCode ")");
break;
}
hashCodesSeen.Add(hashCode, null);
}
Hata ayıklama bir eklenti yazıyorum, ve programın çalışması sırasında benzersiz bir referans NUMARASI falan lazım.
Ben zaten çöp toplayıcı (GC) öbek sıkıştırır kadar eşsiz örneği, iç ADRES (= nesneleri hareket = adreslerini değiştirir) almayı başardı.
Yığın Taşması soruDefault implementation for Object.GetHashCode()ilgili olabilir.
[Düzenle]Bir program ayıklanacak hata ayıklama API kullanarak nesneleri erişiyorum gibi nesneleri benim kontrolüm altında değil, daha net ifade etmeliydim. Eğer nesnelerin kontrolünde olsaydı, kendi benzersiz tanımlayıcıları ekleme önemsiz olacaktır.
Karma tablo bir İD - ^ bina için eşsiz KİMLİĞİ istedim . zaten görülen nesneleri arama yapabilmek nesne için. Şimdilik bu şekilde çözdüm:
Build a hashtable: 'hashCode' -> (list of objects with hash code == 'hashCode')
Find if object seen(o) {
candidates = hashtable[o.GetHashCode()] // Objects with the same hashCode.
If no candidates, the object is new
If some candidates, compare their addresses to o.Address
If no address is equal (the hash code was just a coincidence) -> o is new
If some address equal, o already seen
}
CEVAP
.NET ve daha sadece 4
İyi haber, herkes!
Bu iş için mükemmel bir araç olarak inşa edilmiştir .NET 4 ve ConditionalWeakTable<TKey, TValue>
deniyor. Bu sınıf:
- yönetilen nesne örnekleri bir sözlük (o halde . çok gibi ile ilişkilendirmek rasgele veri için kullanılabilir ^em>sözlük değil)
- bellek adresleri bağlı değildir, GC yığın sıkıştırma karşı bağışıklığı yoktur
- tabloya anahtarları olarak kaydedilmiştir çünkü var olan sadece nesneleri canlı tutmak değil, süreç içinde her nesne sonsuza kadar yaşayacak yapmadan kullanılabilir
- başvuru eşitlik nesne kimliğini belirlemek için kullanır; moveover, sınıf yazarlar kullanılabilmesi için bu davranışı değiştirmeksürekliherhangi bir nesne türü
- anında doldurulabilir, kod içinde kurucular enjekte nesne gerektirmez
.NET benzersiz nesne tanımlayıcısı...
Karşı benzersiz nesne bileşik birincil...
Nasıl "bu" JavaScript bir ne...
Ne kadar inatçı bir SVG&; nesne> et...
Nasıl farklı bir şey dönmek için Mocki...