“简化条件三元表达式”

本文关键字:三元 表达式 条件 | 更新日期: 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;第一次检查将失败,barfalse分配。

所以两条线

        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;

它与三元运算完全相同,但看起来更好。代码的逻辑不会更改。