2009-03-10 18 views
3

Wenn ich in C/C++ programmiert habe, schließe ich häufig Zeigerwerte in die Ablaufverfolgung ein. Dies half, Objekte zwischen Ablaufverfolgungsnachrichten zu korrelieren. In C# habe ich keinen Zeigerwert verfügbar, den ich verfolgen kann. Gibt es gute Alternativen für rückverfolgbare Objekt-IDs?Debugging mit Zeigern in C#

Ich weiß nicht ohne weiteres, wie die zugrunde liegende Speicheradresse zu bekommen, aber selbst wenn ich das tat, würde nicht viel helfen, da der GC Objekte bewegen könnte.

Antwort

2

Fügen Sie eine Klassenvariable hinzu, die bei jedem Konstruktoraufruf inkrementiert wird. Weisen Sie der Klasse diese Klassenvariable als Ihren eigenen Index zu.

class foo 
{ 
    private static int counter; 
    private int instance_counter; 

    public Foo() 
    { 
    instance_counter = counter; 
    counter++; 
    } 

    public string toString() 
    { 
    return "Foo "+instance_counter.toString(); 
    } 
} 

kann nicht kompilieren aus der Box, ich habe keinen Compiler hier.

+0

Es ist ToString eigentlich nicht toString, und Sie müssen als public override public string ToString(), aber andere sagen, dass es funktioniert. Scheint aber ziemlich umständlich. –

2

Verwenden Sie Object.GetHashCode(). Auf die GetHashCode() - Methode kann von allen Objekten aus zugegriffen werden, da jede Klasse in C# von Object abgeleitet wird. Aber es ist garantiert nur einmalig, wenn Object.GetHashCode() aufgerufen wird und sein Ergebnis wird in irgendeiner Weise für die Erzeugung von Hash-Codes für benutzerdefinierte Klassen verwendet. Bitte beachten Sie, dass dies keine absolute Garantie dafür ist, dass Sie immer noch denselben Hashcode für mehr als ein Objekt erhalten.