2010-11-22 13 views
36

Ich komme aus einem C++ - Hintergrund, also Entschuldigung, wenn dies eine nicht C# Art zu denken ist, aber ich muss nur wissen. :)Unique Identify Referenztypen im Debugger

In C++, wenn ich zwei Zeiger habe, und ich möchte wissen, ob sie auf die gleiche Sache zeigen, kann ich in das Speicher/Watch-Fenster schauen und sehen ihren Wert - um zu sehen, ob sie auf den gleichen zeigen Speicherplatz.

In C# konnte ich nichts in diese Richtung finden. Ein Referenztyp mit genau den gleichen Werten könnte tatsächlich das exakt gleiche Objekt sein, oder es könnte etwas völlig anderes sein.

Gibt es eine Möglichkeit für mich, diese Art von Informationen in C# zu sehen? Vielleicht eine Art von Äquivalent zum & Operator für das Watch-Fenster oder so etwas?

Antwort

67

Was Sie suchen, sind Objekt-IDs. Für jeden Referenc-Typ im Debugger können Sie mit der rechten Maustaste klicken und sagen "Make Object ID". Dies fügt ein # Suffix zur Wertspalte hinzu, wenn diese Instanz im Debugger angezeigt wird. Sie können auch # 1, # 2 usw. zum Überwachungsfenster hinzufügen, um sie später jederzeit wieder zu sehen.

Schritt 0 - Führen Sie diesen Code

static void Main(string[] args) 
{ 
    var x = "a string"; 
    var y = x; 
    System.Diagnostics.Debugger.Break(); 
} 

Schritt 1 - Rechtsklick und wählen Sie "Objekt-ID Make"

alt text

Schritt 2 - Instanzen nun mit dem 1 # Suffix anzuzeigen. Hinweis: Ich habe in diesem Schritt nichts Besonderes gemacht. Unmittelbar nach dem Klicken auf "Objekt-ID erstellen" wurden beide Zeilen aktualisiert, um das 1 # -Suffix anzuzeigen, da sie sich auf dieselbe Instanz beziehen.

alt text

Schritt 3 - sie jederzeit sehen von 1 # auf die Watch-Fenster hinzugefügt

alt text

+7

Das ist cool, ich habe noch nie von Objekt-ID gehört. So viele kleine Dinge wie diese, die in VS "versteckt" sind. –

+0

Tolle Soße. Große Erklärung und sexy Visuals. +1 und eine richtige Antwort. :) –

+0

Jetzt, wenn es nur eine Möglichkeit gab, dies in MonoDevelop zu tun ... –

3

Wenn Sie in einem der Variablenfenster mit der rechten Maustaste auf den Namen einer Variablen klicken und "Objekt-ID erstellen" auswählen, weist Visual Studio dieser Instanz eine eindeutige ID zu und zeigt sie in der Spalte Wert an. Die IDs sehen wie {1 #}, {2 #} usw. aus. Wenn zwei Objekte die gleiche ID haben, sind sie referenziell identisch.

Im Code oder im Direktfenster können Sie mithilfe von Object.ReferenceEquals() auch prüfen, ob zwei Objekte identisch sind.

Ich glaube nicht, dass es eine gute Möglichkeit gibt, eine tatsächliche Speicheradresse für ein Objekt im Debugger zu erhalten. Ich vermute, dass das von Entwurf ist, da sich der Speicherort eines Objekts im Speicher während der Garbage Collection in einer verwalteten Anwendung ändern wird. Natürlich könnten Sie einen unsicheren Block deklarieren, das Objekt anheften und mit den üblichen C/C++ - Operatoren einen Zeiger darauf ziehen. Dann könnten Sie den Wert des Zeigers im Debugger sehen. Ich würde das jedoch nicht als gute Angewohnheit empfehlen - das Festhalten von Objekten tendiert dazu, mit der Fähigkeit des Müllsammlers zu scheitern, einen geordneten Haufen zu halten, was wiederum zu schlechterer Leistung und Speicherverbrauch führen kann.