如何在为类值对象重载operator +时处理null?

时间:2017-02-21 14:55:32

标签: c# operator-overloading

我想要一个表示长度的值对象。我更愿意使用struct,因为它是一个值类型,但由于零长度没有意义,我被迫使用class。将两个长度加在一起似乎是一个合理的操作,所以我想重载+运算符。我很好奇,我应该如何处理添加null

null添加到现有字符串将返回与现有字符串具有相同内容的字符串。将null添加到具有值的int?会返回null

我可以看到这样一种情况:将null添加到现有长度只会返回一个与现有长度具有相同值的新长度。与此同时,我可以看到添加null被视为错误的情况。我一直试图找到一些指导,但一直找不到。是否有相同的共同指南,或者每个应用程序是否有所不同?

3 个答案:

答案 0 :(得分:1)

我强烈建议您使用struct作为长度,并将默认表示视为零长度。

  

由于零长度没有意义,我被迫使用class

由您的代码来决定将长度struct的默认表示视为某个特定长度的表示。除了将其视为零长度之外,您至少有两个选项:

  • 您可以将默认长度视为未知,在这种情况下,使用它的任何操作都会产生未知或
  • 您可以将其视为"陷阱表示"长度,在这种情况下,使用它的任何操作都会产生异常。

如果不以统一的方式处理所有其他数字的零,这可能是一个设计错误。具体来说,当您减去长度值时,零长度可能会变得很方便,因为减去两个相等长度的值将无法生成。

至于&#34;未知&#34;就长度而言,使用struct为您Nullable<length>结构的用户提供了一个方便的length标准表示。

答案 1 :(得分:0)

严格来说,现实中不存在空长,一切都有长度。使用结构时获得null返回或NullReferenceException会让我觉得我搞砸了构造函数或实例化。换句话说,空引用将在应用程序的范围内使用,而不会暴露给客户端。

struct length = new MyStruct(); //no!
struct length = new MyStruct(double feet, double inches) //better...

struct length = 34.5; //ok...

答案 2 :(得分:0)

简单回答: 如果您允许在系统中添加空值,那么您应该保留现有值并将其视为0,如下所示:

public static NullNumber operator+ (NullNumber b, NullNumber c) {
    return (b ?? 0) + (c ?? 0); 
}

高级答案: 你可能正确的长度没有意义在0,你是正确的添加空值似乎是一个错误 我无法看到该字段的填充位置,但我怀疑: 如果需要,你没有要求你传递长度的构造函数。 或者你有一个错误的类,有时有一个长度,有时意味着它听起来更接近2个类

相关问题