空检查+取消引用在同一行
Null check + dereference on the same line
在同一行检查 null 和取消引用是否有任何危险?
如果 myObj
实际上为 null,此代码将如何运行?
不同语言处理此类情况的方式是否存在差异(即 C# 与 Java)
例如,如下所示
if(myObj != null && myObj.someProp == "Test")
{
//...
}
&&
是 短路 所以如果 myObj
确实为 null 那么第二个条件将永远不会被评估。
此行为对于 C#
和 Java
都是相同的。
在您的示例中,if 条件需要布尔运算提供的布尔值 myObj != null && myObj.someProp == "Test"。
当使用 && 运算符时,首先检查左操作数。如果它的值等于 true 则检查正确的操作数,因为不可能提前知道它的状态。但是如果它的值等于 false 那么就不需要检查正确的操作数,因为无论正确的条件状态是什么,整个操作都会导致 false.
这就是它安全的原因。
但是当使用 & 运算符时,两个操作数总是被检查。使用 & 运算符,您的示例如下所示:
if(myObj != null & myObj.someProp == "Test")
{
//...
}
这样做,当 myObj 变量等于 null 时,上面的代码将失败。在这种情况下,您的代码将不安全。
希望对您有所帮助;
在同一行检查 null 和取消引用是否有任何危险?
如果 myObj
实际上为 null,此代码将如何运行?
不同语言处理此类情况的方式是否存在差异(即 C# 与 Java)
例如,如下所示
if(myObj != null && myObj.someProp == "Test")
{
//...
}
&&
是 短路 所以如果 myObj
确实为 null 那么第二个条件将永远不会被评估。
此行为对于 C#
和 Java
都是相同的。
在您的示例中,if 条件需要布尔运算提供的布尔值 myObj != null && myObj.someProp == "Test"。
当使用 && 运算符时,首先检查左操作数。如果它的值等于 true 则检查正确的操作数,因为不可能提前知道它的状态。但是如果它的值等于 false 那么就不需要检查正确的操作数,因为无论正确的条件状态是什么,整个操作都会导致 false. 这就是它安全的原因。
但是当使用 & 运算符时,两个操作数总是被检查。使用 & 运算符,您的示例如下所示:
if(myObj != null & myObj.someProp == "Test")
{
//...
}
这样做,当 myObj 变量等于 null 时,上面的代码将失败。在这种情况下,您的代码将不安全。
希望对您有所帮助;