Sto eseguendo alcune registrazioni diagnostiche con uno dei miei progetti C# .NET e vorrei poter registrare un identificatore che rappresenta un'istanza specifica di una classe. So che potrei farlo con una variabile statica che viene incrementata ogni volta che viene creata un'istanza di classe, ma mi chiedo solo se esiste un modo integrato nel framework .NET per farlo. Forse usando la riflessione o qualcosa del genere.Esiste un modo integrato per identificare le istanze di una classe?
risposta
Giusto per aggiungere a quanto Henk said in his answer su GetHashCode
, e per mitigare alcuni dei commenti negativi che ha ricevuto su questo risposta:
C'è un modo per chiamare GetHashCode
su qualsiasi oggetto che è indipendente dal valore di tale oggetto , indipendentemente dal fatto che il suo tipo sia stato sostituito o meno da GetHashCode
.
Dai uno sguardo allo System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode
.
Questo valore non è garantito per essere unico, ovviamente. Né è un Guid
(anche se per quel non essere univoco implicherebbe probabilità che sono legittimamente microscopiche).
Direi che il tuo intestino aveva ragione riguardo alla variabile del contatore statico. Devo dire, tuttavia, che semplicemente incrementandolo usando l'operatore ++
nel costruttore di ogni oggetto non è thread-safe. Se è possibile che tu possa istanziare istanze di una classe da più thread, preferiresti usare Interlocked.Increment
.
Link interessante. –
La cosa più vicina è GetHashCode()
, ma non è garantito che sia univoco. Di solito sarebbe sufficiente per la diagnostica.
Ho appena letto le risposte a questo similar question. Secondo JS, l'overhead di allocare un syncblock per la prima chiamata a GethashCode. Questo potrebbe essere un problema.
Il codice GetHash cambia da istanza a istanza? Non dovrebbe cambiare se gli oggetti sono uguali tra loro. – Zebi
Due istanze della stessa classe inizializzate con gli stessi valori dovrebbero restituire lo stesso codice hash, quindi questo non funzionerebbe affatto. –
@Jon B: Questo è vero solo per alcune classi (come la stringa) che sovrascrivono GethashCode(). La versione di default è parte di System.Object e non può vedere i tuoi membri. Provalo. –
Forse Object.ReferenceEquals
risolve il problema. Almeno ti può dire se un oggetto è uguale a un altro.
Non è possibile utilizzare una variabile statica perché sarà la stessa in ogni istanza. Avrà solo il conteggio degli oggetti creati.
Hai la possibilità di utilizzare la soluzione di Jon B o se desideri che gli identificatori numerici utilizzino un contatore statico e assegni un ID a un campo.
public class Foo
{
static int counter;
public int InstanceId;
public Foo()
{
InstanceId = counter++;
}
}
Sono abbastanza sicuro che ciò che descrivi nella tua ultima parte è esattamente ciò che l'OP intendeva per "variabile statica" (che sarebbe 'counter'). –
Si potrebbe aggiungere una proprietà Guid
alla classe un inizializzare nel costruttore (garantito univoco per ogni istanza).
Utilizzato questa tecnica alcune volte. Puoi semplicemente inizializzare direttamente un campo 'public Guid InstanceId = Guid.NewGuid();' per mantenere pulito il tuo costruttore di roba di debug. – Zebi
Non è molto più semplice o più conveniente rispetto all'utilizzo di un contatore statico. È molto più difficile per gli occhi. –
Come utilizzeresti un contatore statico? Sarà lo stesso in ogni istanza poiché è statico. Mi sbaglio? – Zebi
- 1. iPhone: esiste un modo automatico per identificare le risorse inutilizzate?
- 2. le istanze della classe Classe
- 3. Ottenere tutte le istanze di una classe
- 4. C'è un modo per identificare una classe di dati Kotlin da una normale classe Kotlin?
- 5. Esiste un modo semplice per ottenere tutte le istanze di oggetti di una classe specifica in Java
- 6. Esiste un modo integrato per confrontare due iteratori?
- 7. C'è un modo semplice per confrontare le istanze di BufferedImage?
- 8. Esiste un modo integrato per convertire l'opzione in una convalida scalaz?
- 9. Esiste un modo integrato per ottenere la lunghezza di un iterabile in python?
- 10. Creazione di istanze limite di una classe?
- 11. Esiste un metodo Java integrato per inserire un array?
- 12. Esiste un metodo .NET integrato per ottenere tutte le proprietà e i valori per un oggetto?
- 13. Mocking di un metodo in OCMock per tutte le istanze di una classe
- 14. Identificare le implementazioni della classe base in un array
- 15. Loopback - Il modo più semplice per estendere un modello integrato
- 16. Esiste un modo integrato per ottenere l'URL corrente senza parametri di query?
- 17. Esiste un modo in SQL Server per identificare univocamente un database?
- 18. Esiste una classe IndexSet e una classe Range per Java?
- 19. Il modo migliore per identificare un utente in modo univoco
- 20. Python: Esiste un pacchetto integrato per analizzare html in dom
- 21. Modo efficiente per scrivere istanze di ordinazione?
- 22. Esiste un modo pulito per assegnare la classe di un tipo generico a una variabile?
- 23. Esiste un modo sicuro per avere un file std :: thread come membro di una classe?
- 24. Esiste un modo per ordinare le colonne di una matrice in modo indipendente in R?
- 25. ObjC: esiste un "protocollo di classe"?
- 26. Esiste un test integrato per stabilire se una stringa (o handle) si riferisce a uno script?
- 27. Database per un sistema integrato
- 28. Moq C# integrato nella classe
- 29. C'è un modo per sovrascrivere automaticamente ToString() su una classe?
- 30. Come posso identificare una classe interna anonima in un NotSerializableException
La discussione su questa domanda può essere d'aiuto. http://stackoverflow.com/questions/750947/net-unique-object-identifier –