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实现中存在一个错误,这意味着第一个操作数可能会被计算多次,但不应如此。)
另一个需要注意的有用点是,第一个操作数类型必须可以为空,但第二个操作数不必为空。在第一个操作数是
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; } } } |
这要长得多,但可读性要高得多!
这个??运算符称为空合并运算符,用于为可为空的值类型或引用类型定义默认值。如果操作数不为空,则返回左侧操作数;否则返回右侧操作数。
可以看出,
1 2 3 4 5 | if(b != Null) { a = b; } else { a = c; } |
或者,用另一个简记法[使用三元运算符]:
1 | a = (b!=Null)?b:c; |
这意味着如果返回value==null 0,则返回value
1 | (a != null) ? 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