C#自动属性 ​​- + =后仍为空?

时间:2009-08-26 14:51:10

标签: c# initialization automatic-properties

这对我来说似乎是个错误......

我接受自动属性,定义如下:

public decimal? Total { get; set; }

首次访问时将为null。它们尚未初始化,因此它们当然是空的。

但是,即使通过+ =设置它们的值,这个十进制数?仍然是空的。所以之后:

Total += 8;

总计仍为空。这怎么可能是正确的?我知道它正在做一个(null + 8),但似乎很奇怪,它没有拿起它意味着它应该只被设置为8 ......

补遗:

我在问题中提出了“null + 8” - 但请注意它适用于字符串。所以,它确实为null +“hello”就好了,并返回“hello”。因此,在幕后,它将字符串初始化为值为“hello”的字符串对象。对于其他类型,IMO,行为应该是相同的。这可能是因为字符串可以接受null作为值,但是,空字符串仍然不是初始化对象,对吗?

也许只是因为字符串不是可以为空的......

10 个答案:

答案 0 :(得分:30)

public decimal? Total { get; set; }

null视为“未知价值”。如果你有未知数量的东西,你又增加了8个,你现在有多少个?

答案:未知。

可空值变量的操作

的情况下,对 unknown 值的操作会为您提供可知的结果。

public bool? State { get; set; }

以下语句包含可知的解决方案,即使它们包含未知值:

State = null;
nextState = State & false;         // always equals false
nextState = State & true;          // still unknown (null)

nextState = State | true;          // always true
nextState = State | false;         // still unknown (null)

看模式?

当然,如果你希望 Totalnull时等于(等于)0,你可以使用 null合并运算符并写下这样的东西:

Total = (Total ?? 0) + 8;

除非为Total,否则将在等式中使用null的值,在这种情况下,它将使用值0。

答案 1 :(得分:7)

Null + 8 = Null

您需要在之前将其设置为零。

答案 2 :(得分:5)

null表示未知值,

unknown value + known value = still unknown value

答案 3 :(得分:3)

这是在第一次调用时初始化它并在之后递增它的单行:

    public void InitializeOrIncrement(decimal value)
    {
        // if Total is null then initialize, otherwise increment
        Total = (Total == null) ? value : Total + value;
    }

    public decimal? Total { get; set; }

答案 4 :(得分:2)

来自MSDN

  

进行比较时   可空类型,如果是其中一个的值   可空类型为null和   其他不是,所有比较评估   除了!=(不等于)之外的假。它   重要的是不要假设   因为特别的比较   返回false,相反的情况   返回true。

所以,它按预期工作。

答案 5 :(得分:1)

我知道做

是有意义的
public decimal? Total { get; set; }

Total = (Total ?? 0) + 8;

但不会更容易做到:

public decimal Total { get; set; }

Total的初始值为0

答案 6 :(得分:1)

正如其他人所指出的,null不等于零。虽然从长远来看,空整数默认为零似乎更方便,但可能会产生奇怪的结果,直到为时已晚,您可能无法发现。

作为一个简单示例,假设您的某个数据源失败并使用空值填充结果集。您的计算将空值视为零,继续产生结果。由于数字仍然存在,即使它们可能是错误的,你也许永远不会注意到某些事情已经出现严重错误。

答案 7 :(得分:0)

设置Total的值只是

Total = 8;

我建议您阅读Nullable Types以了解它们的工作原理。您可以使用HasValue检查属性是否具有值。

来自MSDN

  

<强>算

     

预定义的一元和二元   运营商和任何用户定义的   存在于值类型的运算符   也可以由可空类型使用。   这些运算符产生空值   如果操作数为空;除此以外,   运算符使用包含的值   计算结果。例如:

int? a = 10;
int? b = null;

a++;         // Increment by 1, now a is 11.
a = a * 10;  // Multiply by 10, now a is 110.
a = a + b;   // Add b, now a is null.

答案 8 :(得分:0)

Null与零不同。零加八是八......但是零加八?始终为空。就像无限加上任何东西仍然是无限的 - 它是未定义的。

你会发现这一点普遍适用于null。每个数据库(至少我曾经使用过的数据库)都会给你相同的结果。

答案 9 :(得分:0)

公共小数?总计{得到;组; }

这样的事情会起作用吗?如果尚未设置值,则进行某种自动初始化。

public decimal? Total
{
  get { return this.totalValue;}
  set
  { 
     if(totalValue == null) { this.totalValue = 0;}
     this.totalValue = value;
  }
}

private decimal? totalValue;