needs overload operator< and null check

廉价感情. 提交于 2019-12-29 07:25:08

问题


I´m overloading the lessthan-operator in c# and I`m wondering whether this needs to check for null. Below you can find an Example:

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

Or is this correct:

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

I didn´t find any instruction on this. But maybe I missed something.


回答1:


The answer depends on your intended usage pattern. If you plan to have nulls in the mix, and you would like to consider null values to be less than non-null values, then your implementation is correct; if you would like to consider null values to be greater than non-null objects, then the commented out return values (false and true) should be used instead. If you do not plan to allow nulls in the mix, throwing an ArgumentNullException or allowing NullReferenceException would be the right choice.




回答2:


Both approaches are correct (for different values of correct).

If x or y are likely to be null and that has a valid meaning in your case then go with the first approach.

If x and y are highly unlikely to be null then go with the second and let any exceptions propagate to the calling code for handling.




回答3:


Personally I would throw a ArgumentNullException if either x or y are null, which should be an exceptional circumstance.




回答4:


A custom operator is little more than a static method. Moreover, operators in generals shouldn't normally throw exceptions. Which means you need those null-checks if MyClass is a reference-type.

By the way, it's conventional for nulls to be less than non-nulls, which makes your proposed implementation idiomatic.




回答5:


  1. It's a bad idea to overload operators on classes. It's ok for structs though.

  2. If you do decide to overload an operator on a class, you will either have to:
    a. Include null-check into your logic
    b. Throw exceptions when null is passed in
    c. Don't null check and allow for NullReferenceExceptions (bad)

Basically, it's a bad idea to overload an operator on a class. I'd either turn your class into a struct, or just implement an interface such as IComparable<T> / IEquatable<T> which has guidelines when null values are used in comparisons.



来源:https://stackoverflow.com/questions/9618500/needs-overload-operator-and-null-check

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!