这个if语句是否过度杀伤?

时间:2018-04-10 14:12:20

标签: c# if-statement

我有一个名为Investigation的数据库表。在此表中有一列名为INV。此列可以包含值0,1或null。

在我的应用程序中,有一个if语句,如下所示:

QNet.Investigation.DataContracts.Investigation investigation = Session["InvestigationObj"] as QNet.Investigation.DataContracts.Investigation;

if (investigation != null && investigation.INV != null && investigation.INV == true)
{
    ....       
}

在我看来,这有点过分,因为如果survey.INV == true那么显然其他两个语句将不会为空。如果其他两个中的任何一个为null,那么investigation.INV也将为null。

我在这里遗漏了什么吗?原始开发人员是否有理由以这种方式创建if语句?不会

if(investigation.INV == true)
{
    ...
}

做同样的事情吗?

4 个答案:

答案 0 :(得分:6)

  

岂不

if(investigation.INV == true)
{
    ...
}
     

做同样的事情吗?

不,如果NullReferenceExceptioninvestigation,则会导致null。这就是 以任何方式检查null的原因,可以是null-coalesce-operator,也可以使用你的 - 不可否认的 - 或者if语句或者什么。

换句话说:

仅因为investigation不是null并不意味着investigation.INVtrue。它显然可以是false甚至null

答案 1 :(得分:3)

是和否。仅仅因为Investigation对象不为null并不意味着它的属性将被初始化和/或设置为所需的值。

你可以将null合并为语句:

If (investigation?.INV == true)
{ 
    //do this
}

与您正在做的事情完全相同 - 检查根对象是否为空&如果属性为null,它就像'try',并且会跳过该块,这样你就不会出错。

答案 2 :(得分:2)

在C#中你可以根据你所限制的版本来缩短它。

这是我原来唯一的答案,直到它被标记下来,但我更喜欢它,因为你可以立即看到.INV可以通过它的编写方式为空。最后一个底部答案,我相信是最受欢迎的答案,但对我而言,它说INV可以为空或者开发人员选择在if语句中使用== true(我知道其中有一些)并且我只是#&# 39;不喜欢那种发展方式。这是我个人的偏好;除非有人能够找到一个利用另一个利益(例如循环中的表现压力或其他东西)。

if (investigation?.INV ?? false)
{
    ....       
}

OR

if ((investigation?.INV).GetValueOrDefault())
{
    ....
}

OR

虽然这可能是我最不喜欢的答案,因为我不想在if语句中添加== true。个人偏好都是。

if (investigation?.INV == true)
{
    ....
}

答案 3 :(得分:-3)

可能有点矫枉过正,但你可以简单地使用

  "dependencies": {
    "react": "^16.3.1",
    "react-dom": "^16.3.1",
    "react-table": "^6.8.0",
    "vue": "^2.5.2",
    "vue-router": "^3.0.1",
    "vuera": "^0.2.1"
  }

如果INV为null,则获得bool的默认值,即false ...

ofc你应该检查调查对象是否为空或只是在较高的C#版本中使用if((bool)investigation.INV) { ... }