【问题标题】:what does value ?? 0 means in c# code有什么价值?? 0 表示在 C# 代码中
【发布时间】:2012-01-27 07:15:46
【问题描述】:
get { return _a.B; }

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

我已经用 c# 编写了上面的代码。在上面的代码中 (value ?? 0) != true 是什么意思??

【问题讨论】:

标签: c#


【解决方案1】:

??null-coalescing 运算符。

展开,意思是:

value == null ? 0 : value;

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

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关于这个操作符的使用。

【讨论】:

    【解决方案2】:

    这是null-coalescing operator

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

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

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

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

    【讨论】:

      【解决方案3】:

      如果 value 为 null,则返回 ?? 之后的内容,否则返回其自身的值。 http://msdn.microsoft.com/en-us/library/ms173224.aspx

      【讨论】:

        【解决方案4】:
        _a.B.Equals(value ?? 0) 
        

        可以改写为

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

        这意味着如果_a.B等于value,如果value不为null,否则等于0

        【讨论】:

          【解决方案5】:

          a ?? b 基本上是简写

          (a != null) ? a : b
          

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

          if (a != null)
             a
          else
             b
          

          【讨论】:

          • ...但重要的是,a 只会被评估一次。
          【解决方案6】:

          表示如果value == null 则返回0,否则返回value

          【讨论】:

            【解决方案7】:

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

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

            或者,用另一种简写表示法[使用三元运算符]:

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

                (value ?? 0) != true 没有任何意义,它是 _a.B.Equals(value ?? 0) != true 意味着什么。
                那是!(_a.B ==(值??0)),这与“如果值不为空,则_a.B等于值或如果_a.B为空,则等于0)相反。

                你可以这样重写代码sn-p:

                set
                {
                    if (value == null)
                    {
                        if (_a.B != 0)
                        {
                            _a.B = 0;
                        }
                    }
                    else
                    {
                        if (_a.B != value)
                        {
                            _a.B = value;
                        }
                    }
                }
                

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2016-07-07
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-04-24
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多