.NET benzersiz nesne tanımlayıcısı | Netgez.com
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

  • 24 Канал

    24 КанаÐ

    5 ÅžUBAT 2006
  • Baby Big Mouth

    Baby Big Mou

    5 Mart 2013
  • Miles Fisher

    Miles Fisher

    8 NİSAN 2009