【发布时间】:2009-08-26 14:51:09
【问题描述】:
这对我来说似乎是一个错误......
我接受这样定义的自动属性:
public decimal? Total { get; set; }
第一次访问时将为空。它们还没有被初始化,所以它们当然是空的。
但是,即使在通过 += 设置它们的值之后,这个小数?仍然为空。所以之后:
Total += 8;
总计仍为空。这怎么可能是正确的?我知道它正在执行 (null + 8),但似乎很奇怪它没有接收到这意味着它应该设置为 8...
附录:
我在我的问题中提出了“null + 8”点 - 但请注意它适用于字符串。因此,它执行 null + "hello" 就好了,并返回 "hello"。因此,在幕后,它是将字符串初始化为值为“hello”的字符串对象。其他类型 IMO 的行为应该相同。可能是因为字符串可以接受 null 作为值,但 null 字符串仍然不是初始化对象,对吗?
也许只是因为字符串不能为空......
【问题讨论】:
-
"它们还没有被初始化,所以它们当然是空的。"这是你困惑的症结所在。在这种情况下,属性最初会自动分配给 null。你是从一个谎言中推断出来的:该属性是未分配的。 该属性是最初分配的。 C# 中没有“未分配的属性”之类的东西。
-
有趣的区别。同样有趣的是,您可以找到数千个将“初始化为 null”的值称为“未初始化”的示例。所以也许这是一个普遍的误解。我很好奇的一件事 - 如果我们有这个问题,我们不想让“null + 8 = 8”或“null && true == true”,为什么当这些类型时没有抛出异常事情完成了吗?似乎这样可以防止一些难以调试的错误。
标签: c# initialization automatic-properties