问题
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:
It's a bad idea to overload operators on classes. It's ok for structs though.
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