什么是价值??0表示在c#代码中

什么是价值??0表示在c#代码中,c#,C#,我已经用c#对上述代码进行了编码。在上面的代码中,什么是(值??0)!=真正的平均值是运算符 value == null ? 0 : value; 扩大,意味着: get { return _a.B; } set { if (( _a.B.Equals(value ?? 0) != true )) { _a.B= value ?? 0; } } 这是不带运算符的set访问器的详细版本 value == null ? 0 : value; 关于此运算符的用法,

我已经用c#对上述代码进行了编码。在上面的代码中,什么是(值??0)!=真正的平均值是运算符

value == null ? 0 : value;
扩大,意味着:

get { return _a.B; }

set
{
   if (( _a.B.Equals(value ?? 0) != true ))
   {
      _a.B= value ?? 0;
   }
}
这是不带运算符的set访问器的详细版本

value == null ? 0 : value;
关于此运算符的用法,有许多限制。

??
是运算符

value == null ? 0 : value;
扩大,意味着:

get { return _a.B; }

set
{
   if (( _a.B.Equals(value ?? 0) != true ))
   {
      _a.B= value ?? 0;
   }
}
这是不带运算符的set访问器的详细版本

value == null ? 0 : value;

关于此运算符的用法,有很多限制。

如果值为null,则返回在???之后的值,否则返回其自身的值。
value == null ? 0 : value;

如果值为空,则返回???后面的值,否则返回其自身的值。

可以重写为

_a.B.Equals(value ?? 0) 
这意味着,若a.B等于value,若value不为null,则等于零

可以重写为

_a.B.Equals(value ?? 0) 

这意味着如果a.B等于value,如果value不为null,则等于零??b基本上是

_a.B.Equals(value == null ? 0 : value) 
这意味着“给我
a
,但如果
a
为空,则给我
b
的默认值。” 进一步的
?:表达式是以下内容的简写:

(a != null) ? a : b

a??b
基本上是

_a.B.Equals(value == null ? 0 : value) 
这意味着“给我
a
,但如果
a
为空,则给我
b
的默认值。” 进一步的
?:表达式是以下内容的简写:

(a != null) ? a : b

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

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

a=b??c
可以扩展到:

if (a != null)
   a
else
   b
或者,用另一种简写法[使用三元运算符]:

if(b != Null) {
    a = b;
} else {
    a = c;
}

a=b??c
可以扩展到:

if (a != null)
   a
else
   b
或者,用另一种简写法[使用三元运算符]:

if(b != Null) {
    a = b;
} else {
    a = c;
}

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

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

它是正确的操作数

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

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

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

a = (b!=Null)?b:c;
这是最重要的

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

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

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

a = (b!=Null)?b:c;
(值??0)!=true没有任何意义,它是_a.B.等于(值??0)!=没错,这意味着什么。
那是什么东西!(_a.B==(值??0)),这与“如果值不为null,则为_a.B等于值;如果_a.B为null,则为等于0”相反

您可以通过以下方式重写代码段:

int defaultValue = 10;
int? potentialValue = GetValueFromSomewhere();
int valueOrDefault = potentialValue ?? defaultValue;
这要长得多,但可读性要高得多!

(值0)!=true并不意味着什么,它是_a.B等于(值0)!=true意味着什么。
这就是!(_a.B==(值??0)),这是“如果值不为null,则是_a.B等于值,如果值为null,则是_a.B等于0”的对立面

您可以通过以下方式重写代码段:

int defaultValue = 10;
int? potentialValue = GetValueFromSomewhere();
int valueOrDefault = potentialValue ?? defaultValue;

这要长得多,但可读性强得多

您为什么使用不懂的运算符编写代码的精确副本?您为什么使用不懂的运算符编写代码的精确副本的可能副本?您为什么使用不懂的运算符编写代码的可能副本。。。但重要的是,
a
只被评估一次。。。。但重要的是,
a
只能计算一次。