我有一个条件我写的是检查三件事。
if(LoggedInMembershipUser == null || obj == null || boolVal)
在这种情况下,“LoggedInMembershipUser”只是Membership.GetUser(),“obj”是一些随机业务对象,“boolVal”显然是一个布尔值。当我按上述方式编写语句时,resharper告诉我语句的boolVal部分始终为false。但是当我把boolVal放在startnig中时,我没有注意到这一点。
if(boolVal|| LoggedInMembershipUser == null || obj == null)
为什么第一个总是假的,但第二个不是?
编辑:这是在网格视图的行数据绑定中。网格显示来自具有相同基类的两个对象的结果,因此如果“obj”是其中一个对象类型而不是另一个,则“obj”将具有值。 boolVal是一个指示器,它是什么类型的对象现在,我想它,我想如果obj为null,那么boolVal将永远为真。 resharper意识到了一些如何?哦,我打赌这是因为我在我的行上方查看了我的代码:
if (!uploaded){
var obj = GetObjectLogic();
}
好的感谢帮助评论。我想这可以投票删除或其他。
答案 0 :(得分:15)
如果没有更多的方法,很难确定,但它看起来确实如下:
ReSharper确定boolVal
可以成立的唯一方法是LoggedInMembershipUser
或obj
中至少有一个为空。第一个if
永远不会到达boolval
部分,除非两者都不为空。因此,在评估boolVal
时,它必须是假的。
如果重新排序条件,则该逻辑不再成立。 ReSharper可能会分析该表达式,确定所有部分都是快速且无副作用的,并注意到boolVal
在第二种情况下也不是必需的,但该分析有点困难,显然还没有编写。
答案 1 :(得分:3)
每次我使用ReSharper调查了一个意外的Expression is always true|false
场景时,该工具已证明比我聪明。例如,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()
,短路任何进一步的评估。