C#如何能够复制结构的内存但不能测试相等性?

时间:2011-03-10 02:31:31

标签: c# .net struct operators

我可以将一个struct的值分配给另一个,并自动复制内存。但是,如果我想测试两个结构是否包含相同的数据(就好像我刚刚完成了一个赋值),我必须对其进行显式编码。这是为什么?看起来框架应该有一个默认的operator == for structs实现。

3 个答案:

答案 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));
}