SORU
15 NİSAN 2009, ÇARŞAMBA


.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
20 Mart 2012, Salı


.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

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jeremy Stark

    Jeremy Stark

    23 Mayıs 2010
  • Mark Brown

    Mark Brown

    9 HAZİRAN 2010
  • SoundHound

    SoundHound

    8 Mart 2006