13

我有一个条件,我正在写它检查三件事。

if(LoggedInMembershipUser == null || obj == null || boolVal)

在这种情况下,“LoggedInMembershipUser”只是 Membership.GetUser(),“obj”是一些随机业务对象,“boolVal”显然是一个布尔值。当我编写上述语句时,ReSharper 告诉我语句的 boolVal 部分始终为假。但是当我把 boolVal 放在下面的开头时,我没有得到那个通知。

if(boolVal|| LoggedInMembershipUser == null || obj == null)

为什么第一个总是假的,而第二个却不是?

编辑:这是在网格视图的行数据绑定中。网格显示来自具有相同基类的两个对象的结果,因此如果“obj”是其中一种对象类型而不是另一种,则“obj”将具有一个值。boolVal 是它是哪种类型的对象的指标,所以现在我考虑一下,我猜如果 obj 为空,那么 boolVal 将始终为真。ReSharper 是否以某种方式意识到了这一点?哦,我敢打赌,这是因为在我的行上方查看我的代码:

if (!uploaded){
    var obj = GetObjectLogic();
}

好的,感谢您的帮助评论。我想这可以被投票删除或其他。

4

2 回答 2

16

如果没有更多的方法,很难确定,但它确实看起来像以下:

ReSharper 已确定,唯一boolVal可能为真的方法是至少其中一个LoggedInMembershipUserorobj为空。除非两者都不为空,否则第一个if永远不会到达该部分。boolval因此,在boolVal被评估的地方,它一定是假的。

如果您对条件重新排序,则该逻辑不再成立。ReSharper 可能会分析该表达式,确定所有部分都是快速且无副作用的,并注意到boolVal在第二种情况下也没有必要,但该分析有些困难,并且显然尚未编写。

于 2013-01-24T21:01:02.407 回答
3

每次我Expression is always true|false使用 ReSharper 调查一个意想不到的场景时,该工具都被证明比我更聪明。例如,ReSharper 知道继承树;在这个代码块中:

void doSomething(Object obj)
{
    if(obj is StreamReader || obj is TextReader)
        foo();
}

...ReSharper 将标记(obj is TextReader)Expression is always false,因为(obj is StreamReader)代码分支已经捕获了任何TextReader对象并跳转到foo(),从而使任何进一步的评估短路。

于 2014-10-29T15:57:19.587 回答