什么是 ”??


what is “?? ”operator in c#?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is the “??” operator for?

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

1
2
3
4
public NameValueCollection Metadata
{
    get { return metadata ?? (metadata = new NameValueCollection()); }
}

这被称为空合并运算符,它的作用如下:假设a是一个可以为空的int,而b是一个正常的int。

1
b = a ?? 1;

等于

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

等于

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

因此

1
2
3
4
public NameValueCollection Metadata
{
    get { return metadata ?? (metadata = new NameValueCollection()); }
}

展开后应该像这样

1
2
3
4
5
6
7
8
9
10
public NameValueCollection Metadata
{
    get
    {
        if(metadata == null)
            return (metadata = new NameValueCollection());
        else
            return metadata;
    }
}

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


??操作员(C参考)

The ?? operator is called the
null-coalescing operator and is used
to define a default value for a
nullable value types as well as
reference types. It returns the
left-hand operand if it is not null;
otherwise it returns the right
operand.

您的示例可以重新编写为:

1
2
3
4
5
6
7
8
9
public NameValueCollection Metadata
  {
    get {
          if (metadata == null)
              metadata = new NameValueCollection();

          return metadata;
         }
  }


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  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");
}

}


这用于在变量为空时替换默认值。

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

阅读详细讨论"C"有多有用?操作员?


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

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


这是coalesce运算符,它检查是否为空。

statement ?? fallback如果语句的计算结果为null,则使用fallback。参见MSDN。


??是空合并运算符吗?

在这里阅读:链接文本