这对我来说似乎是个错误......
我接受自动属性,定义如下:
public decimal? Total { get; set; }
首次访问时将为null。它们尚未初始化,因此它们当然是空的。
但是,即使通过+ =设置它们的值,这个十进制数?仍然是空的。所以之后:
Total += 8;
总计仍为空。这怎么可能是正确的?我知道它正在做一个(null + 8),但似乎很奇怪,它没有拿起它意味着它应该只被设置为8 ......
补遗:
我在问题中提出了“null + 8” - 但请注意它适用于字符串。所以,它确实为null +“hello”就好了,并返回“hello”。因此,在幕后,它将字符串初始化为值为“hello”的字符串对象。对于其他类型,IMO,行为应该是相同的。这可能是因为字符串可以接受null作为值,但是,空字符串仍然不是初始化对象,对吗?
也许只是因为字符串不是可以为空的......
答案 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)
看模式?
当然,如果你希望 Total
在null
时等于(等于)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;