有什么价值?


what does value ?? 0 means in c# code

1
2
3
4
5
6
7
8
9
get { return _a.B; }

set
{
   if (( _a.B.Equals(value ?? 0) != true ))
   {
      _a.B= value ?? 0;
   }
}

我已经用C编码了上述代码。在上面的代码中,什么是(值?0)!=真平均值??


??是空合并运算符。

扩展,意思是:

1
value == null ? 0 : value;

这里是不带运算符的set访问器的详细版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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的讨论。


它是空合并运算符。

正如其他答案所指出的,它计算第一个操作数。如果不是空值,那么这就是总值。否则,它将计算第二个操作数,这是总值。但重要的是,两个操作数的计算都不超过一次,只有在第一个操作数为空时才计算第二个操作数。由于类型之间的潜在转换,事情稍微复杂一些,但这是一般原则。

(至少,这就是理论。当前MS实现中存在一个错误,这意味着第一个操作数可能会被计算多次,但不应如此。)

另一个需要注意的有用点是,第一个操作数类型必须可以为空,但第二个操作数不必为空。在第一个操作数是Nullable类型,第二个操作数是T类型的常见情况下,整个表达式的类型是T类型。例如:

1
2
3
int defaultValue = 10;
int? potentialValue = GetValueFromSomewhere();
int valueOrDefault = potentialValue ?? defaultValue;


(价值?0)!=true并不意味着什么,它是a.b.等于(值?0)!是的,这意味着什么。这是真的!(_a.b==(值??0)),与"如果值不为空,则is _a.b等于值;如果_a.b为空,则等于0")相反。

您可以这样重写代码段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
set
{
    if (value == null)
    {
        if (_a.B != 0)
        {
            _a.B = 0;
        }
    }
    else
    {
        if (_a.B != value)
        {
            _a.B = value;
        }
    }
}

这要长得多,但可读性要高得多!


这个??运算符称为空合并运算符,用于为可为空的值类型或引用类型定义默认值。如果操作数不为空,则返回左侧操作数;否则返回右侧操作数。


可以看出,a = b??c扩大到:

1
2
3
4
5
if(b != Null) {
    a = b;
} else {
    a = c;
}

或者,用另一个简记法[使用三元运算符]:

1
a = (b!=Null)?b:c;

这意味着如果返回value==null 0,则返回value


a ?? b基本上是

1
(a != null) ? a : b

意思是"给我a,但是如果a为空,给我b的默认值。此外,? :表达式是以下内容的简写:

1
2
3
4
if (a != null)
   a
else
   b


1
_a.B.Equals(value ?? 0)

可以重写为

1
_a.B.Equals(value == null ? 0 : value)

这意味着如果a.b等于value,如果value不为空,否则等于零


如果值为空,则返回后面是什么??,否则返回自身的值。http://msdn.microsoft.com/en-us/library/ms173224.aspx