需要重载运算符<;和空检查

本文关键字:检查 lt 重载 运算符 | 更新日期: 2023-09-27 18:27:13

我正在重载c#中的lesssthan运算符,我想知道这是否需要检查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;
}

我没有找到任何关于这方面的说明。但也许我错过了什么。

需要重载运算符<;和空检查

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

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

如果xy可能为null,并且在您的情况下这具有有效的含义,那么使用第一种方法。

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

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

自定义运算符只不过是一个静态方法。此外,一般情况下,运算符不应该抛出异常。这意味着如果MyClass是引用类型,则需要这些null检查。

顺便说一句,nulls小于非nulls是惯例,这使得您提出的实现习惯化。

  1. 在类上重载运算符是个坏主意。不过这对structs来说没问题。

  2. 如果您决定在类上重载运算符,则必须:
    a.在逻辑中包含空检查
    b.传入null时抛出异常
    c.不要进行空检查并允许NullReferenceException(坏的)

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