get { return _a.B; }
set
{
if (( _a.B.Equals(value ?? 0) != true ))
{
_a.B= value ?? 0;
}
}
我已经用c#编写了上面的代码。在上面的代码中(value ?? 0)!= true是什么意思??
答案 0 :(得分:3)
??
是null-coalescing运营商。
扩展,意思是:
value == null ? 0 : value;
以下是没有运算符的set accessor的详细版本。
set
{
// assumes that this is a nullable type (based on usage)
int? coalescedValue = value;
if( coalescedValue == null )
{
coalescedValue = 0;
}
if( ( _a.B.Equals( coalescedValue ) != true ) )
{
_a.B = coalescedValue;
}
}
SO上有dozens of discussions关于此运算符的使用情况。
答案 1 :(得分:2)
正如其他答案所指出的那样,它会评估第一个操作数。如果那不是null,那么这就是整体价值。否则,它评估第二个操作数, 整体值。但重要的是,两个操作数都不会被多次计算,只有第一个操作数为空时才会计算第二个操作数。由于类型之间可能存在转换,事情稍微复杂一些,但这是一般原则。
(至少,这就是理论。当前MS实现中存在一个错误,这意味着第一个操作数可能会被多次评估 - 但它不应该被评估。)
另一个有用的要点是第一个操作数类型必须可以为空,但第二个操作数类型不必是 - 并且在第一个操作数类型为{{的常见情况下1}}和第二个操作数是Nullable<T>
类型,整个表达式的类型是T
。例如:
T
答案 2 :(得分:0)
如果value为null,则返回??之后的值,否则返回它自己的值。 http://msdn.microsoft.com/en-us/library/ms173224.aspx
答案 3 :(得分:0)
_a.B.Equals(value ?? 0)
可以改写为
_a.B.Equals(value == null ? 0 : value)
这意味着如果_a.B等于value,如果value不为null,否则等于零
答案 4 :(得分:0)
a ?? b
基本上是
(a != null) ? a : b
表示“给我a
,但如果a
为空,请给我默认值b
”。
此外,? :
表达式是:
if (a != null)
a
else
b
答案 5 :(得分:0)
这意味着如果返回value == null 0,则返回值
答案 6 :(得分:0)
a = b??c
扩展为:
if(b != Null) {
a = b;
} else {
a = c;
}
或者,用另一种简写符号[使用三元运算符]:
a = (b!=Null)?b:c;
答案 7 :(得分:0)
?? operator被称为null-coalescing运算符,用于为可空值类型或引用类型定义默认值。如果操作数不为null,则返回左侧操作数;否则它返回正确的操作数。
答案 8 :(得分:0)
(value ?? 0)!= true并不意味着什么,它是_a.B.Equals(值?? 0)!= true表示意思。
那个东西是!(_ a.B ==(value ?? 0)),这是“如果_a.B为空,则_a.B等于值,如果value不为null或等于0”。< / p>
您可以通过以下方式重写代码段:
set
{
if (value == null)
{
if (_a.B != 0)
{
_a.B = 0;
}
}
else
{
if (_a.B != value)
{
_a.B = value;
}
}
}
这个更长,但更具可读性!