Требуется оператор перегрузки <и нулевая проверка

Я перегружаю оператор lessthan в С#, и мне интересно, нужно ли это проверять на null. Ниже вы можете найти пример:

public static bool operator <(MyClass x, MyClass y)
{
  if (x == null && y == null)
  {
    return false;
  }
  if (x == null)
  {
    return true; //false?
  }
  if (y == null)
  {
    return false; //true?
  }
  return x.Value < y.Value;
}

Или это правильно:

public static bool operator <(MyClass x, MyClass y)
{
  return x.Value < y.Value;
}

Я не нашел никаких инструкций по этому поводу. Но, возможно, я что-то пропустил.

Ответы

Ответ 1

Ответ зависит от вашего предполагаемого шаблона использования. Если вы планируете иметь нули в миксе, и вы хотели бы считать значения null меньше, чем ненулевые значения, то ваша реализация верна; если вы хотите, чтобы значения null были больше чем ненулевые объекты, тогда вместо этого следует использовать возвращаемые значения с комментариями (false и true). Если вы не планируете разрешать пустые значения в миксе, выбор правильного выбора ArgumentNullException или разрешения NullReferenceException будет правильным.

Ответ 2

Оба подхода правильны (при разных значениях правильности).

Если x или y, скорее всего, будут пустыми и имеют правильное значение в вашем случае, перейдите к первому подходу.

Если x и y вряд ли будут равны нулю, перейдите со вторым и пусть любые исключения распространяются на вызывающий код для обработки.

Ответ 3

Лично я бы выбрал ArgumentNullException, если x или y являются null, что должно быть исключительным обстоятельством.

Ответ 4

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

Кстати, для nulls он условно меньше чем nulls, что делает вашу предполагаемую реализацию идиоматичной.

Ответ 5

  • Неплохая идея перегрузить операторов на классы. Это нормально для структур.

  • Если вы решите перегрузить оператор в классе, вам либо нужно:
    а. Включить проверку нулевой логики в вашу логику
    б. Выбрасывать исключения, когда null передается в
    с. Не null проверить и разрешить NullReferenceExceptions (плохо)

В принципе, это плохая идея перегрузить оператор в классе. Я бы превратил ваш класс в структуру или просто реализовал интерфейс, например IComparable<T>/IEquatable<T>, который имеет рекомендации, когда в сравнениях используются значения null.