需要过载运算符<和空检查

时间:2012-03-08 13:37:33

标签: c# operator-overloading

我在c#中重载了lessthan-operator,我想知道这是否需要检查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;
}

我没有找到任何关于此的指示。但也许我错过了一些东西。

5 个答案:

答案 0 :(得分:12)

答案取决于您的预期使用模式。如果您计划在混合中使用空值,并且您希望将null值视为小于非空值,那么您的实现是正确的;如果您想将null值视为大于非空对象,则应使用已注释掉的返回值(falsetrue)。如果您不打算在混合中允许空值,则抛出ArgumentNullException或允许NullReferenceException将是正确的选择。

答案 1 :(得分:4)

两种方法都是正确的(对于不同的正确值)。

如果xy可能为空并且在您的案例中具有有效含义,请使用第一种方法。

如果xy极不可能为null,那么请使用第二个,并将任何异常传播到调用代码进行处理。

答案 2 :(得分:2)

如果xynull,我个人会抛出ArgumentNullException,这应该是特殊情况。

答案 3 :(得分:1)

自定义运算符只不过是静态方法。此外,一般的操作员通常不应该抛出异常。这意味着如果MyClass是引用类型,则需要进行空检查。

顺便说一下,nulls的常规值低于非nulls,这使得您提出的实现方式不合时宜。

答案 4 :(得分:-1)

  
      
  1. 在类上重载运算符是个坏主意。结构虽然可以。

  2.   
  3. 如果您决定在课程上重载操作员,您将要么:>   一个。在您的逻辑中包括空检查   湾在传递null时抛出异常   C。不要空检查并允许NullReferenceExceptions(错误)

  4.   

基本上,在类上重载运算符是个坏主意。我要么把你的类变成一个结构,要么只实现一个IComparable<T> / IEquatable<T>这样的接口,它在比较中使用空值时有指导。