Требуется оператор перегрузки <и нулевая проверка
Я перегружаю оператор 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.