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.
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.
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.
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%