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.
Null + 8 = Null
Run Code Online (Sandbox Code Playgroud)
您需要先将其设置为零.
null
意味着未知价值,
unknown value + known value = still unknown value
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5553 次 |
最近记录: |