нужен оператор перегрузки <и проверка нуля - PullRequest
14 голосов
/ 08 марта 2012

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

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;
}

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

Ответы [ 5 ]

12 голосов
/ 08 марта 2012

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

4 голосов
/ 08 марта 2012

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

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

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

2 голосов
/ 08 марта 2012

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

1 голос
/ 08 марта 2012

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

Кстати, обычно nulls меньше, чем не-nulls, что делает предложенную реализацию идиоматической.

0 голосов
/ 08 марта 2012
  1. Плохая идея перегружать операторы в классах.Это нормально для структур.

  2. Если вы решите перегрузить оператор класса, вам придется:
    a.Включите нулевую проверку в свою логику
    b.Бросать исключения, когда NULL передается в
    c.Не проверяйте null и не допускайте NullReferenceExceptions (плохо)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...