Je fais une journalisation de diagnostic avec un de mes projets C# .NET et j'aimerais pouvoir enregistrer un identifiant qui représente une instance spécifique d'une classe. Je sais que je pourrais le faire avec une variable statique qui s'incrémente chaque fois qu'une instance de classe est créée, mais je me demande simplement s'il existe un moyen intégré dans le framework .NET pour le faire. Peut-être en utilisant la réflexion ou quelque chose.Y a-t-il un moyen intégré d'identifier les instances d'une classe?
Répondre
Juste pour ajouter à ce que Henk said in his answer au sujet GetHashCode
, et pour atténuer certains des commentaires négatifs qu'il a reçus sur cette réponse:
Il y a une façon d'appeler GetHashCode
sur un objet qui est indépendante de la valeur de cet objet , indépendamment du fait que son type a ou non remplacé GetHashCode
.
Jetez un oeil à System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode
.
Cette valeur n'est pas garantie d'être unique, bien sûr. Aucun n'est Guid
(bien que pour que pas soit unique impliquerait des cotes qui sont légitimement microscopiques). Je dirais que votre instinct était juste au sujet de la variable de compteur statique. Je devrais mentionner, cependant, que l'incrémenter simplement en utilisant l'opérateur ++
dans le constructeur de chaque objet n'est pas thread-safe. Si cela est possible, vous pouvez instancier des instances d'une classe à partir de plusieurs threads que vous souhaitez utiliser à la place Interlocked.Increment
.
Lien intéressant. –
La chose la plus proche est GetHashCode()
, mais cela n'est pas garanti d'être unique. Il serait généralement suffisant pour le diagnostic cependant.
Je viens de lire les réponses à cette similar question. Selon JS, il y a la surcharge de l'allocation d'un syncblock pour le 1er appel à GethashCode. Cela pourrait être un problème.
Est-ce que GetHashcode change d'instance en instance? Cela ne devrait pas changer si les objets sont égaux. – Zebi
Deux instances de la même classe initialisées avec les mêmes valeurs devraient renvoyer le même code de hachage, donc cela ne fonctionnerait pas du tout. –
@Jon B: Cela n'est vrai que pour certaines classes (comme la chaîne) qui remplacent GethashCode(). La version par défaut fait partie de System.Object et ne peut pas voir vos membres. Essayez-le. –
Peut-être que Object.ReferenceEquals
résout votre problème. Au moins, il peut vous dire si un objet est le même qu'un autre.
Vous ne pouvez pas utiliser une variable statique car elle sera la même dans chaque instance. Il aura juste le compte des objets créés.
Vous avez la possibilité d'utiliser la solution de Jon B ou si vous voulez des identifiants numériques, utilisez un compteur statique et attribuez un identifiant à un champ.
public class Foo
{
static int counter;
public int InstanceId;
public Foo()
{
InstanceId = counter++;
}
}
Je suis à peu près sûr que ce que vous décrivez dans votre dernière partie est exactement ce que l'OP voulait dire par "variable statique" (ce serait "counter"). –
Vous pouvez ajouter une propriété Guid
à votre classe d'initialiser dans le constructeur (garantie unique pour chaque instance).
Utilisé cette technique plusieurs fois. Vous pouvez simplement initialiser un champ 'public Guid InstanceId = Guid.NewGuid();' pour garder votre constructeur propre des choses de débogage. – Zebi
Ce n'est pas beaucoup plus facile ou plus pratique que d'utiliser un compteur statique. C'est beaucoup plus dur pour les yeux. –
Comment utiliseriez-vous un compteur statique? Il en sera de même dans chaque cas puisqu'il est statique. Est-ce que je me trompe? – Zebi
La discussion à cette question peut vous aider. http://stackoverflow.com/questions/750947/net-unique-object-identifier –