Есть ли компактный способ указать компилятору C # использовать базовые операторы Equals и ==? - PullRequest
9 голосов
/ 27 сентября 2011

Я довольно плохо знаком с C # и пришел из C ++.

Я определил структуру, и компилятор (Microsoft) продолжает выдавать сообщение об ошибке CA1815 «GenericSendRequest должен переопределить Equals»

Я немного прочел и увидел, что структуры C # происходят от ValueType, который реализует универсальный метод Equals с использованием отражения. Это смутило меня больше:

  1. Почему компилятор создает ошибку вместо предупреждения, если это просто проблема производительности?
  2. Почему он вообще определяет этот общий Equals, если он не позволит вам его использовать?

Так как я могу сказать компилятору, что "мне все равно"? Нечто подобное с простым объявлением оператора присваивания в классе 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();
    }

в моей структуре, которая просто ужасна.

Edit: Это определение структуры:

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

Он использует только несколько возвращаемых значений из функции:

public static GenericSendRequest CreateGenericSendRequest(...);

Ответы [ 2 ]

9 голосов
/ 27 сентября 2011

Это определенно не ошибка, это всего лишь предупреждение - и это предупреждение будет отображаться только в том случае, если вы включили анализ кода как часть вашей сборки. Это предложение для оптимизации производительности - так и есть.

Edit:

Оказывается, это настраивается:

Перейти к Project Properties | Code Analysis | Run this rule set.. Open

Разверните раздел Performance - для CA 1815 вы можете выбрать, хотите ли вы, чтобы это было предупреждением, ошибкой или нет.

enter image description here

3 голосов
/ 27 сентября 2011

Вы как-то немного потерялись в IDE, это не ошибка компилятора.Это ошибка анализа кода, выполняемая инструментом, известным как FxCop.Вы можете отключить его с помощью Analyze + Configure, убрав галочку с опции «Включить анализ кода при сборке».

Инструмент немного нудный, его использование скорее напоминание о том, что вы могли сделать что-то неразумное.Что в этом случае маловероятно, это не та структура, которую вы можете осмысленно сравнить, не выполняя много работы.Это предупреждение о производительности, средство сравнения по умолчанию для структуры использует отражение, и это не очень эффективно.Но вы сделаете это намного менее эффективным, реализовав правильную версию Equals ().

Есть что-то еще не так, структура в C # совсем не ведет себя как структура в C ++.Его следует использовать только для простых значений, которые можно легко скопировать, учитывая, что это тип значения.Вы должны сделать это классом.Решает ошибку анализа тоже.

...