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()); } } |
这被称为空合并运算符,它的作用如下:假设
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 |
阅读详细讨论"C"有多有用?操作员?
这个??运算符称为空合并运算符,用于定义可为空值类型以及引用类型的默认值。如果不是空值,则返回左侧操作数;否则返回右侧操作数。
http://msdn.microsoft.com/en-us/library/ms173224.aspx
这是coalesce运算符,它检查是否为空。
??是空合并运算符吗?
在这里阅读:链接文本