是否有一种紧凑的方式告诉C#编译器使用基本的Equals和==运算符?

时间:2011-09-27 02:13:32

标签: c# c#-4.0 struct override equals

我是C#的新手,我来自C ++背景。

我已经定义了一个结构,并且(Microsoft)编译器不断弹出错误CA1815“'GenericSendRequest'应该覆盖等于”

我读了一下,看到C#结构派生自ValueType,它使用反射实现通用的Equals。这让我更加困惑:

  1. 如果只是性能问题,为什么编译器会创建错误而不是警告?
  2. 如果它不能让你使用它,它为什么首先定义通用Equals?
  3. 那么如何告诉编译器“我不关心”?类似于在C ++类中声明赋值运算符而不提供定义来承认我知道我在做什么。

    到目前为止,我的解决方案包括:

        public static bool operator ==(GenericSendRequest lhs, GenericSendRequest rhs)
        {
            return lhs.Equals(rhs);
        }
    
        public static bool operator !=(GenericSendRequest lhs, GenericSendRequest rhs)
        {
            return !lhs.Equals(rhs);
        }
    
        public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }
    
        //Yes, it also makes me override GetHashCode since I'm overriding Equals.
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
    

    在我的结构中,这很糟糕。

    修改 这是结构定义:

    public struct GenericSendRequest
    {
            public LiveUser             Sender;
            public LiveUser[]           Receivers;
            public Message              Msg;
            public ServiceHttpRequest   HttpRequest;
    }
    

    它的用法只是函数的多个返回值:

    public static GenericSendRequest CreateGenericSendRequest(...);
    

2 个答案:

答案 0 :(得分:9)

这绝对不是一个错误,它只是一个警告 - 如果你已经启用了代码分析作为构建的一部分,那么警告甚至只会出现。这是性能优化的建议 - 采取这种方式。

修改

原来这是可配置的:

转到Project Properties | Code Analysis | Run this rule set.. Open

展开Performance部分 - 对于CA 1815,您可以选择是将此设置为警告,还是错误或无。

enter image description here

答案 1 :(得分:3)

你在IDE中有点迷失,这不是编译器错误。这是一个代码分析错误,由称为FxCop的工具执行。您可以使用Analyze + Configure禁用它,取消选中“在构建时启用代码分析”选项。

这个工具有点麻烦,它的使用更像是提醒你,你可能做了一些不明智的事情。在这种情况下,这是不太可能的,这不是你可以有意义地比较没有做很多工作的那种结构。这是一个性能警告,结构的默认相等比较器使用反射,并且效率不高。但是通过实现正确版本的Equals(),你会降低效率。

还有其他问题,C#中的结构根本不像C ++中的结构。它应该只用于可以轻松复制的简单值,因为它是一个值类型。你应该把它变成一个类。也解决了分析错误。