我可以将一个struct的值分配给另一个,并自动复制内存。但是,如果我想测试两个结构是否包含相同的数据(就好像我刚刚完成了一个赋值),我必须对其进行显式编码。这是为什么?看起来框架应该有一个默认的operator == for structs实现。
答案 0 :(得分:6)
ValueType.Equals
的默认实现完全符合您的要求。所以如果你这样做:
s1 = ...;
s2 = ...;
s1.Equals(s2);
对“等于”的调用将进行您正在寻找的自动深度比较。
通常,C#倾向于不使用重载运算符,这可能是它没有实现运算符的原因。
此外,哲学上,C#倾向于回避隐式行为,包括隐式生成方法等。
答案 1 :(得分:5)
该框架具有默认的Equals
实现。 ==
运算符是您必须自己实现的C#功能,如果您愿意,可以使用Equals
。
答案 2 :(得分:-2)
如果您拥有执行本机代码权限,请致电memcmp
:
static class memcmpsig<T> where T : struct
{
[DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl)]
static extern int memcmp(ref T left, ref T right, UIntPtr count);
}
static class CompareExtension
{
int CompareTo<T>(this T left, T right) { return memcmpsig<T>::memcmp(left, right, Marshal::SizeOf(typeof(T));
}