.NET中是否存在一种方法(可能是内部的),它可以比较相同类型的任何两个值的相等性,而不进行任何装箱,并且逐字节?我知道有ValueType.Equals
,它会检查值类型中是否包含任何引用(依次调用ValueType.FastEqualsCheck
)并逐字节地比较它们,但是你必须选中它们调用此方法的值。
我知道我可以通过FieldInfo.GetValueDirect
以反射方式实现此方法,但由于反射它仍然会有点慢。
该方法应该是通用的或接受TypedReference
(与大多数类似的内部方法一样)。
编辑:手动进行比较的不安全方法:
public static class ByteComparer<T> where T : struct
{
public static readonly Func<T, T, bool> Compare;
static ByteComparer()
{
var t = typeof(T);
var dyn = new DynamicMethod("Compare", typeof(bool), new[]{t, t}, typeof(ByteComparer<T>));
var il = dyn.GetILGenerator();
il.DeclareLocal(t.MakeByRefType(), true);
il.DeclareLocal(t.MakeByRefType(), true);
il.Emit(OpCodes.Ldarga_S, 0);
il.Emit(OpCodes.Stloc_0);
il.Emit(OpCodes.Ldarga_S, 1);
il.Emit(OpCodes.Stloc_1);
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Conv_I);
il.Emit(OpCodes.Ldloc_1);
il.Emit(OpCodes.Conv_I);
il.Emit(OpCodes.Sizeof, t);
il.EmitCall(OpCodes.Call, typeof(ByteComparer<T>).GetMethod("ByteCompare", BindingFlags.NonPublic | BindingFlags.Static), null);
il.Emit(OpCodes.Ret);
Compare = (Func<T,T,bool>)dyn.CreateDelegate(typeof(Func<T,T,bool>));
}
private static unsafe bool ByteCompare(byte* a, byte* b, int size)
{
for(int i = 0; i < size; i++)
{
if(*(a+i) != *(b+i)) return false;
}
return true;
}
}