Gibt es eine eingebaute Möglichkeit, Instanzen einer Klasse zu identifizieren?

8

Ich mache eine Diagnoseprotokollierung mit einem meiner C # .NET-Projekte, und ich möchte in der Lage sein, einen Bezeichner zu protokollieren, der eine bestimmte Instanz einer Klasse darstellt. Ich weiß, dass ich dies mit einer statischen Variable tun könnte, die bei jeder Erstellung einer Klasseninstanz nur inkrementiert wird, aber ich frage mich nur, ob es dafür im .NET-Framework eine eingebaute Möglichkeit gibt. Vielleicht mit Reflektion oder etwas.

    
PICyourBrain 25.08.2010, 20:02
quelle

4 Antworten

5

Nur um hinzuzufügen, was sagte Henk in seiner Antwort zu GetHashCode und um einige der negativen Kommentare, die er zu dieser Antwort erhielt, zu mildern:

Es gibt eine Möglichkeit, GetHashCode für beliebiges -Objekt aufzurufen, das unabhängig vom Wert dieses Objekts ist, unabhängig davon, ob der Typ GetHashCode überschrieben hat oder nicht.

Sehen Sie sich System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode an.

Dieser Wert ist natürlich nicht eindeutig. Weder ist ein Guid (obwohl für das nicht , um einzigartig zu sein, würde Chancen beinhalten, die legitimerweise mikroskopisch sind).

Ich würde sagen, Ihr Darm hatte Recht mit der statischen Zählervariable. Ich sollte jedoch erwähnen, dass es einfach nicht threadsicher ist, es mit dem Operator ++ im Konstruktor jedes Objekts einfach zu erhöhen. Wenn es möglich ist, könnten Sie Instanzen einer Klasse aus mehreren Threads instanziieren, die Sie verwenden möchten Interlocked.Increment stattdessen.

    
Dan Tao 25.08.2010, 20:31
quelle
7

Sie könnten Ihrer Klasse eine Guid -Eigenschaft hinzufügen und sie im Konstruktor initialisieren (garantiert für jede Instanz eindeutig).

    
Jon B 25.08.2010 20:09
quelle
3

Am ehesten ist GetHashCode() , aber das ist nicht garantiert einzigartig. In der Regel reicht dies jedoch für die Diagnose aus.

Ich lese gerade die Antworten zu dieser ähnlichen Frage . Laut JS gibt es den Overhead der Zuweisung eines Syncblocks für den ersten Aufruf von GethashCode. Das könnte ein Problem sein.

    
Henk Holterman 25.08.2010 20:06
quelle
0

Vielleicht löst Object.ReferenceEquals Ihr Problem. Zumindest kann es Ihnen sagen, ob ein Objekt das gleiche ist wie ein anderes.

Sie können eine statische Variable nicht verwenden, da sie in jedem Fall gleich ist. Es wird nur die Anzahl der Objekte erstellt.

Sie haben die Möglichkeit, Jon Bs Lösung zu verwenden, oder wenn Sie numerische Bezeichner verwenden möchten, verwenden Sie einen statischen Zähler und weisen Sie einem Feld eine ID zu.

%Vor%     
Zebi 25.08.2010 20:06
quelle

Tags und Links