什么是c#中的“??”运算符?

时间:2010-08-07 16:01:19

标签: c#

  

可能重复:
  What is the “??” operator for?

“??”是什么运算符在表达式中执行?

public NameValueCollection Metadata
{
    get { return metadata ?? (metadata = new NameValueCollection()); }
}

7 个答案:

答案 0 :(得分:28)

这称为null-coalescing运算符,它的作用如下,假设a是一个可以为空的int,b是一个普通的int

b = a ?? 1;

等于

b = (a != null ? (int)a : 1);

等于

if(a != null)
    b = (int)a;
else
    b = 1;

因此

public NameValueCollection Metadata
{
    get { return metadata ?? (metadata = new NameValueCollection()); }
}

展开应该看起来像这样

public NameValueCollection Metadata
{
    get
    {
        if(metadata == null)
            return (metadata = new NameValueCollection());
        else
            return metadata;
    }
}

这是一种单线程单例模式,因为getter每次请求时都会返回元数据(一个初始化的NameValueCollection对象),期望第一次它在那个时候为null,所以它初始化它然后返回它。这是偏离主题但请注意,这种单例模式的方法不是线程安全的。

答案 1 :(得分:5)

?? Operator (C# Reference)

  

??运营商被称为   使用null-coalescing运算符   为a定义默认值   可空值的类型以及   参考类型。它返回   左手操作数,如果它不为空;   否则它返回权利   操作数。

您的示例可以重写为:

public NameValueCollection Metadata
  {
    get { 
          if (metadata == null)
              metadata = new NameValueCollection();

          return metadata;
         }
  }

答案 2 :(得分:2)

来自MSDN:http://msdn.microsoft.com/en-us/library/ms173224.aspx

可空类型可以包含值,也可以是未定义的。 ?? ??运算符定义将可空类型分配给非可空类型时要返回的默认值。如果您尝试将可空值类型分配给不可为空的值类型而不使用??运算符,您将生成编译时错误。如果使用强制转换,并且当前未定义可空值类型,则将抛出InvalidOperationException异常。

  class NullCoalesce
 {
static int? GetNullableInt()
{
    return null;
}

static string GetStringValue()
{
    return null;
}

static void Main()
{
    // ?? operator example.
    int? x = null;

    // y = x, unless x is null, in which case y = -1.
    int y = x ?? -1;

    // Assign i to return value of method, unless
    // return value is null, in which case assign
    // default value of int to i.
    int i = GetNullableInt() ?? default(int);

    string s = GetStringValue();
    // ?? also works with reference types. 
    // Display contents of s, unless s is null, 
    // in which case display "Unspecified".
    Console.WriteLine(s ?? "Unspecified");
}

}

答案 3 :(得分:1)

这用于在NULL变量的情况下替换默认值。

X =  (if Y is not null return Y) ?? (else return DEFAULT)

阅读How useful is C#'s ?? operator?

上的详细讨论

答案 4 :(得分:0)

这是coalesce运算符,它检查null。

statement ?? fallback如果语句评估为null,则使用fallback。请参阅msdn

答案 5 :(得分:0)

?? operator被称为null-coalescing运算符,用于为可空值类型和引用类型定义默认值。如果它不为null,则返回左侧操作数;否则返回正确的操作数。

http://msdn.microsoft.com/en-us/library/ms173224.aspx

答案 6 :(得分:-1)

??是空合并运算符

在这里阅读: link text