NULL检查运算符(?.)
见下面代码:
void test(object obj)
{
// obj 没有进行 `NULL` 检查,可能会报错
string s = obj.ToString();
}
没有进行 NULL 检查,正确的版本是这样的:
void test(object obj)
{
string s = "";
if(obj != null){
s = obj.ToString();
}
}
正确倒是正确了,代码取变得难读多了。在C# 6.0中,引入了一个 ?. 的运算符,前面的代码可以改成如下形式:
void test(object obj)
{
string s = obj?.ToString();
}
从这个例子中我们也可以看出它的基本用法:如果对象为 NULL,则不进行 . 后面的操作,直接返回 NULL
空合并运算符(??)
如果此运算符的左操作数不为 null,则此运算符将返回左操作数,否则返回右操作数。
例如:a??b 当 a 为 null 时则返回 b,a不为 null 时则返回a本身
string test(string a,string b)
{
return a??b;
}
?. 和 ?? 结合使用
void test(object obj)
{
// 如果 obj为null就返回 "",否则就返回 obj.ToString()
string s = obj?.ToString() ?? "";
}
可空类型修饰符(?)
引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。
例如:int i=null; 编译器就会报错。
为了使值类型也可为空,就可以使用 可空类型,即用可空类型修饰符 ? 来表示,表现形式为 T?
例如:
int?表示可空的整形DateTime?表示可为空的时间
T? 其实是 System.Nullable(泛型结构) 的缩写形式,
例如:int? 编译后是 System.Nullable