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

Sam*_*tte 9 c# initialization automatic-properties

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

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

public decimal? Total { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

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

Total += 8;
Run Code Online (Sandbox Code Playgroud)

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

补遗:

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

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

Rob*_*ino 31

public decimal? Total { get; set; }
Run Code Online (Sandbox Code Playgroud)

被认为null是"未知价值".如果你有一个未知数量的东西,你又增加了8个,你现在有多少?

答:未知.

可空变量的操作

某些情况下,对未知值的操作会为您提供可知的结果.

public bool? State { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

看模式?

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

Total = (Total ?? 0) + 8;
Run Code Online (Sandbox Code Playgroud)

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


CD.*_*D.. 7

Null + 8 = Null
Run Code Online (Sandbox Code Playgroud)

您需要先将其设置为零.

  • 您*不*有未初始化的值。您有一个初始化为 null 的值。 (2认同)

RaY*_*ell 5

null 意味着未知价值,

unknown value + known value = still unknown value
Run Code Online (Sandbox Code Playgroud)