0

这主要是一个语法糖/最佳实践问题。

这是一个有问题的代码示例:

if (_instanceData?.DataSourceType != null && Util.IsEntityBacked(_instanceData.DataSourceType) {// code}

我知道如果 _instanceData 为空,安全导航运算符将继续执行,但在这种情况下,条件中的第一个布尔值是否会按预期进行评估?这会成功地对 _instanceData 和 DataSourceType 进行空检查吗?

另一个例子:

if (LockAcquired && _instanceData?.ObjInfo != null) {// code}

在这种情况下,_instanceData 可能为空,也可能不是,但 ObjInfo 为空。仅对对象和属性进行老式的空值检查是更好的做法,还是可以按预期完成工作?

编辑:这个问题更好地描述为:if (obj?.prop != null)相当于 if (obj != null && obj.prop != null)

4

1 回答 1

1

第一个相当于

if (_instanceData != null && _instanceData.DataSourceType != null && Util.IsEntityBacked(_instanceData.DataSourceType) {// code}

第二个相当于

if (LockAcquired && _instanceData != null && _instanceData.ObjInfo != null) {// code}

所以它会检查 _instanceData 是否为空,然后检查 _instanceData.DataSourceType 是否为空,然后是最后一个条件。正如你所说,这只是语法糖,所以你不必写两个!= null条件。结果的 IL 代码完全相同,因此是否使用运算符是一个偏好问题。

在访问深度嵌套的属性时,它确实节省了大量空间,这是它最有用的地方

if(Parent != null)
{
    if(Parent.Child != null)
    {
        if(Parent.Child.GrandChild != null)
        {
             Parent.Child.GrandChild.GreatGrandChild.name = "Parent IV";
        }
     }
}

变成

Parent?.Child?.GrandChild?.GreatGrandChild.name = "Parent IV";

节省大量空间!即使您将所有 if 合并到一个语句中,它仍然可以节省大量击键和屏幕噪音。

于 2019-12-03T16:25:39.297 回答