“??”是什么运算符在表达式中执行?
public NameValueCollection Metadata
{
get { return metadata ?? (metadata = new NameValueCollection()); }
}
答案 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)
??运营商被称为 使用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)
上的详细讨论
答案 4 :(得分:0)
这是coalesce运算符,它检查null。
statement ?? fallback
如果语句评估为null
,则使用fallback
。请参阅msdn。
答案 5 :(得分:0)
?? operator被称为null-coalescing运算符,用于为可空值类型和引用类型定义默认值。如果它不为null,则返回左侧操作数;否则返回正确的操作数。
答案 6 :(得分:-1)
??是空合并运算符
在这里阅读: link text