Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用C#Safe导航运算符(?)检查对象是否为null以及属性?_C#_Syntax_Null_Safe Navigation Operator - Fatal编程技术网

是否可以使用C#Safe导航运算符(?)检查对象是否为null以及属性?

是否可以使用C#Safe导航运算符(?)检查对象是否为null以及属性?,c#,syntax,null,safe-navigation-operator,C#,Syntax,Null,Safe Navigation Operator,这主要是一个语法/最佳实践问题 下面是一个有问题的代码示例: if (_instanceData?.DataSourceType != null && Util.IsEntityBacked(_instanceData.DataSourceType) {// code} 我知道如果_instanceData为null,安全导航操作符将继续执行,但在这种情况下,条件中的第一个布尔值是否会按预期进行计算?这将成功地对_instanceData和DataSourceType进行空检

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

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

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

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

另一个例子:

if (LockAcquired && _instanceData?.ObjInfo != null) {// code}
在这种情况下,_instanceData可能为null,也可能不是,但ObjInfo为null。只对对象和属性进行老式的空检查是更好的做法,还是可以按预期完成工作

编辑:问题最好描述为: 如果(obj?.prop!=null)等同于
如果(obj!=null&&obj.prop!=null)
第一个等价于

if (_instanceData != null && _instanceData.DataSourceType != null && Util.IsEntityBacked(_instanceData.DataSourceType) {// code}
if (LockAcquired && _instanceData != null && _instanceData.ObjInfo != null) {// code}
第二个相当于

if (_instanceData != null && _instanceData.DataSourceType != null && Util.IsEntityBacked(_instanceData.DataSourceType) {// code}
if (LockAcquired && _instanceData != null && _instanceData.ObjInfo != null) {// code}
因此,它将检查_instanceData是否为null,然后检查_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";

节省了很多空间!即使您将所有的ifs折叠成一条语句,它仍然可以节省大量的击键和屏幕噪音

我不完全清楚您在问什么-但在第一个示例中,如果
\u instanceData
\u instanceData.DataSourceType
为null,则
\u instanceData?.DataSourceType
的结果将为null,因此
&
运算符的第一个操作数将计算为false,因此,第二个操作数将不会被计算。如果这还不够信息,我建议您尝试组合一个-,我怀疑通过运行它,它将回答您的问题。您上面的代码片段是有效的,并且是预期的用例。
?。
数据源类型
没有任何作用。您的
!=空
check正在执行此操作。但正如其他人所说,我们并不清楚你到底在问什么。你似乎看到了物体和财产之间的区别?没有。运算符可以应用于对象或结构,无论它们来自何处,也可以应用于属性。“保存导航”对操作员来说是一个奇怪的标题。它只需将(x!=null&&x.y!=null&&x.y.z!=null)写入if(x?.y?.z!=null)即可。这意味着
如果值已经为null,则表达式的结果为null,否则取以下成员的值