[英]C# Automatic Properties - Still null after +=?
这对我来说似乎是个错误......
我接受自动属性,定义如下:
public decimal? Total { get; set; }
首次访问时将为null。 它们尚未初始化,因此它们当然是空的。
但是,即使在通过+ =设置它们的值之后,这个十进制? 仍然是空的。 之后:
Total += 8;
总计仍为空。 这怎么可能是正确的? 我知道它正在做一个(null + 8),但似乎很奇怪,它没有拿起它意味着它应该只被设置为8 ...
补遗:
我在我的问题中提出了“null + 8” - 但请注意它适用于字符串。 所以,它确实为null +“hello”就好了,并返回“hello”。 因此,在幕后,它将字符串初始化为值为“hello”的字符串对象。 对于其他类型,IMO,行为应该是相同的。 这可能是因为字符串可以接受null作为值,但是,空字符串仍然不是初始化对象,对吗?
也许这只是因为一个字符串不是可以为空的......
public decimal? Total { get; set; }
将null
视为“未知值”。 如果你有一个未知数量的东西,你又增加了8个,你现在有多少?
答:未知。
可空变量的操作
在某些情况下,对未知值的操作会为您提供可知的结果。
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 coalescing运算符并写下这样的东西:
Total = (Total ?? 0) + 8;
除非它是null
, 否则它将在等式中使用Total
null
,在这种情况下,它将使用值0。
Null + 8 = Null
您需要先将其设置为零。
null
表示未知值,
unknown value + known value = still unknown value
这是在第一次调用时初始化它并在之后增加它的单行:
public void InitializeOrIncrement(decimal value)
{
// if Total is null then initialize, otherwise increment
Total = (Total == null) ? value : Total + value;
}
public decimal? Total { get; set; }
来自MSDN :
当您使用可空类型进行比较时,如果其中一个可空类型的值为null而另一个不是,则除了!=(不等于)之外,所有比较都会计算为false。 重要的是不要假设因为特定比较返回false,相反的情况返回true。
所以,它按预期工作。
我知道这样做很有意义
public decimal? Total { get; set; }
Total = (Total ?? 0) + 8;
但它不会更容易做到:
public decimal Total { get; set; }
Total的初始值为0
正如其他人所指出的,null不等于零。 虽然从长远来看,空整数默认为零似乎更方便,但可能会产生奇怪的结果,直到为时已晚,您可能无法发现。
作为一个简单的例子,假设您的一个数据源失败并使用空值填充结果集。 . 您的计算会将空值视为零并 。 由于数字仍然存在,即使它们可能是错误的,你也许永远不会注意到某些事情已经出现严重错误。
设置Total的值就是
Total = 8;
我建议阅读Nullable Types以了解它们的工作原理。 您可以使用HasValue
检查属性是否具有值。
来自MSDN :
运营商
预定义的一元和二元运算符以及值类型存在的任何用户定义的运算符也可以由可空类型使用。 如果操作数为null,则这些运算符产生空值; 否则,运算符使用包含的值来计算结果。 例如:
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.
Null与零不同。 零加八是八......但是零加八? 始终为空。 就像无限加上任何东西仍然是无限的 - 它是未定义的。
你会发现这普遍适用于null。 每个数据库(至少我曾经使用过的数据库)都会给你相同的结果。
公共小数? 总计{得到; 组; }
会这样的吗? 如果尚未设置值,则进行某种自动初始化。
public decimal? Total
{
get { return this.totalValue;}
set
{
if(totalValue == null) { this.totalValue = 0;}
this.totalValue = value;
}
}
private decimal? totalValue;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.