0

可能重复:
在 .NET 中依赖 && 短路安全吗?

我不知道如何正确地表达问题的标题,但是用一行代码来解释很简单:

if (someObject == null || someObject.someProperty)
    ...

我可以这样做吗?或者这个:

if (someObject != null && someObject.someProperty)
    ...
4

5 回答 5

5

是的。

只有当第一个操作数是 时,才会计算第二个操作数false

但显然,第二个操作数也必须是布尔值。

同样,&&仅当第一个操作数为 时才计算第二个操作数true

这称为短路。

于 2013-01-13T21:56:04.147 回答
4

是的,这是安全的。||并且&&短路运算符。从MSDN 库

条件或运算符 (||) 对其布尔操作数执行逻辑或,但仅在必要时评估其第二个操作数。

操作

x || y

对应操作

x | y

除了如果 x 为真,则不计算 y(因为无论 y 的值是什么,OR 运算的结果都是真)。这称为“短路”评估。

于 2013-01-13T21:56:32.270 回答
0

是的,通常的做法是在 if 语句中使用空值检查,通常使用 AND。

这是有效的,因为如果第一个为真,该语句将短路并结束。

这两个都是有效的:

if(something != null && something.Bool)
  ...

if(something != null || something.Bool)
  ...
于 2013-01-13T21:56:57.643 回答
0

是的,||两者&&都短路。事实上,你偶尔会看到人们编写这样的代码:

x != null && x.f();

这相当于:

if(x != null) x.f();

(大多数时候可能不是一个好主意 - 这不利于可读性。)

于 2013-01-13T21:58:43.450 回答
0

是的,你可以,但你想要哪一个取决于你所追求的语义。

在第一种情况下,如果根本没有对象或属性返回 true,则您的条件将运行。基本上没有实例意味着条件逻辑应该执行。

在第二种情况下,没有实例不会导致您的条件运行;在这种情况下,您必须同时拥有一个实例并且该属性的计算结果必须为真。

我今天在加载用户偏好时处理了同样的事情。我必须决定是否“检查”了首选项,并且由于我们可能会添加新的首选项(无需为每个用户为该首选项添加行到数据库中),因此我选择了符合我的用例的后一种条件。

于 2013-01-13T21:59:23.317 回答