sto leggendo Effective C# e non v'è un commento su Object.GetHashCode()
che non ho capito:Attuazione della Object.GetHashCode()
Object.GetHashCode()
utilizza un campo interno della classeSystem.Object
per generare il valore hash. Ad ogni oggetto creato viene assegnata una chiave oggetto univoca, memorizzata come numero intero, quando viene creata.
Queste chiavi iniziano da 1 e incrementano ogni volta che un nuovo oggetto di qualsiasi tipo ottiene creato. Il campo Identità oggetto è impostato nel costruttoreSystem.Object
e non può essere modificato in seguito.Object.GetHashCode()
restituisce questo valore come codice hash per un dato oggetto.
Ho provato a guardare la documentazione di Object.GetHashCode()
e non ho trovato alcuna informazione al riguardo.
ho scritto il semplice pezzo di codice per stampare il codice hash di oggetti appena generato:
using System;
namespace TestGetHashCode
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
object o = new object();
Console.WriteLine(o.GetHashCode());
}
}
}
}
i primi numeri che sono stati stampati sono stati:
37121646,
45592480,
57352375,
2637164,
41014879,
3888474,
25209742,
26966483,
31884011
Il che non sembra fit che
Queste chiavi iniziano da 1 e aumentano ogni volta che viene creato un nuovo oggetto di qualsiasi tipo ...
Object.GetHashCode()
restituisce questo valore
Poi, al fine di trovare questo "campo interno nel System.Object
" Ho provato ad utilizzare ReSharper decompiled sources ma il codice che ho trovato è stato
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
[__DynamicallyInvokable]
public virtual int GetHashCode()
{
return RuntimeHelpers.GetHashCode(this);
}
e ancora una volta l'utilizzo di fonti decompilati ho scoperto che RuntimeHelpers.GetHashCode
era implementato come
[SecuritySafeCritical]
[__DynamicallyInvokable]
[MethodImpl(MethodImplOptions.InternalCall)]
public static int GetHashCode(object o);
seguente the MethodImpl attribute sembra che non riesco a visualizzare l'implementazione e questo è un morto en d per me.
Qualcuno può spiegare il commento dell'autore (la prima citazione)?
Qual è il campo interno all'interno della classe Object e come viene utilizzato per l'implementazione di Object.GetHashCode()
?
Questo può essere utile: http://stackoverflow.com/questions/720177/default-implementation -for-object-gethashcode –
@Yuval Itzchakov: è un'ironia? Altrimenti, perché la pensi così? – zerkms
@Yuval Itzchakov: perché pensi che 'GetHashCode()' debba restituire un ** identificativo univoco **? Si chiama 'Get * Hash * Code()' non 'Get * UniqueIdentifier *()' con lo scopo – zerkms