“简化条件三元表达式”
本文关键字:三元 表达式 条件 | 更新日期: 2023-09-27 17:57:00
var foo = context.FOOTABLE.FirstOrDefault();
var bar = foo != null ? foo.SomeBool : false;
雷利普告诉我要Simplify conditional ternary expression
.但我觉得这里需要一个空检查,因为FirstOrDefault()
可以返回空。
那么,谁错了,我还是Resharper?
首先,一个完整的示例:
class Foo
{
public bool SomeBool { get; set; }
}
class Program
{
static void Main(string[] args)
{
var foo = MaybeFoo();
var bar = foo != null && foo.SomeBool;
}
static Foo MaybeFoo()
{
return new Random().Next() < 10 ? null : new Foo();
}
}
这里MaybeFoo
是一个有时返回null
有时返回Foo
的方法。我使用了Random
,以便 R# 不会自动确定它总是 null 或非 null。
现在,正如您在这一行中所说:
var bar = foo != null ? foo.SomeBool : false;
R# 提供检查简化条件运算符。这是什么意思?好吧,像往常一样,我们可以 Alt+Enter 并接受建议,看看它想要用什么替换它,在这种情况下是:
var bar = foo != null && foo.SomeBool;
现在,关于您的关注:
但我觉得这里需要进行空检查,因为 FirstOrDefault() 可以返回空值。
那么,谁错了,我还是Resharper?
好吧,简而言之,你是。这里仍然进行空检查,并且&&
运算符短路,因此仅当第一个操作数true
时,才会计算第二个操作数(foo.SomeBool
)。因此,在foo
null
的情况下不会有NullReferenceException
;第一次检查将失败,bar
将false
分配。
所以两条线
var bar = foo != null ? foo.SomeBool : false;
和
var bar = foo != null && foo.SomeBool;
在语义上是等效的,R# 像往常一样更喜欢更简洁的版本(特别是条件中的显式 true
s 和 false
s 通常是冗余代码的标记)。您可能不会,在这种情况下,您可以关闭此检查。
ReSharper建议将代码更改为:
var bar = foo != null && foo.SomeBool;
它与三元运算完全相同,但看起来更好。代码的逻辑不会更改。