可空表达式只能是 C# 6.0+ 才可以使用,VS2015+ 版本才支持。
在这个表达式出现之前,当我们得到一个对象时,并想要使用这个对象之前,都必须先判断该对象是否为 null,否则使用对象时就会抛出 NullReferenceException
异常(未将对象引用设置到对象的实例)。就像下面这个例子:
public static void Main(string[] args)
{
var user = GetUser(1);
if(user == null)
{
//这里可以自定义
throw new NullReferenceException("指定的用户没有找到");
}
//当 user 对象不是 null 时,我们才可以这样
var name = user.Name;
var password = user.Password;
}
现在使用可空表达式(?.) 问号点
当对象是 null 时不访问后面点的对象
比如刚才的代码,我们就可以这样使用:
public static void Main(string[] args)
{
var user = GetUser(1);
var name = user?.Name;
var password = user?.Password;
}
?. 表达式将声明对象转换成了可为空类型
比如上面的代码是字符串,那如果我是一个 int
类型的会是怎样?
int? age = user?.Age;
题外话
数据类型后面加一个问号,表示该类型可以是 null。你可以通过该对象的
HasValue
属性做一个判断,表示该对象有值,然后再使用该对象的Value
属性获取到值。
int? age = user?.Age;
if(age.HasValue)
{
Console.Write(age.Value);
}
再举一个例子:
public event EventHandler OnEventChange; // 声明一个事件
//...中间忽略
//不使用可空表达式时
if(OnEventChange != null) // 判断该时间是否被订阅
{
OnEventChange();
}
//使用可空表达式
OnEventChange?.Invoke();
老司机的总结
很明显可空表达式减少了一层判断,明显减少了我们的代码量,也提高了我们的效率。当然我们也需要选择性使用,而不是滥用。