die folgenden Methoden in C# Bedenken Sie:Warum wird die Methode GetHashCode() für DateTime anders verglichen mit anderen Strukturen kompiliert?
public static int HashCodeFunction(Decimal value)
{
return value.GetHashCode();
}
public static int HashCodeFunction(Int64 value)
{
return value.GetHashCode();
}
public static int HashCodeFunction(DateTime value)
{
return value.GetHashCode();
}
die sich den Anweisungen vom Compiler generiert Werfen wir einen Blick:
Für die Decimal
Methode:
ldarga.s Parameter:System.Decimal value
call Method:System.Decimal.GetHashCode()
ret
Für die Int64
Methode:
ldarga.s Parameter:System.Int64 value
call Method:System.Int64.GetHashCode()
ret
Für die DateTime
Methode:
ldarga.s Parameter:System.DateTime value
constrained Type:System.DateTime
callvirt Method:System.Object.GetHashCode()
ret
Warum ist die DateTime.GetHashCode()
Methode als virtueller Aufruf von Object.GetHashCode()
behandelt zu werden, wenn man bedenkt es eine außer Kraft gesetzt GetHashCode()
Methode für die DateTime
Struktur?
Des Weiteren kann ich eine Methode erstellen, die die System.DateTime.GetHashCode()
Methode ohne den virtuellen Aufruf mit dem folgenden Code direkt aufruft:
DynamicMethod myDynamicMethod = new DynamicMethod("myHashCodeMethod", typeof(int), new[] { typeof(DateTime) });
ILGenerator gen = myDynamicMethod.GetILGenerator();
LocalBuilder local = gen.DeclareLocal(typeof(DateTime));
gen.Emit(OpCodes.Ldarga_S, local);
gen.Emit(OpCodes.Call, typeof(DateTime).GetMethod("GetHashCode"));
gen.Emit(OpCodes.Ret);
dann einen Delegaten zu testen:
Func<DateTime, int> myNewHashCodeFunction = (Func<DateTime,int>)myDynamicMethod.CreateDelegate(typeof(Func<DateTime, int>));
DateTime dt = DateTime.Now;
int myHashCode = myNewHashCodeFunction(dt);
int theirHashCode = dt.GetHashCode();
// These values are the same.
Nur neugierig Warum ist die Methode auf diese Weise standardmäßig für Int64
und Decimal
implementiert, aber nicht DateTime
.
Außerordentliche Ansprüche erfordern außergewöhnliche Beweise, ich sehe keine. –