【问题标题】:"Simplify conditional ternary expression"“简化条件三元表达式”
【发布时间】:2013-01-31 09:01:56
【问题描述】:
var foo = context.FOOTABLE.FirstOrDefault(); 
var bar = foo != null ? foo.SomeBool : false;

Resharper 告诉我Simplify conditional ternary expression。但我觉得这里有必要进行 null 检查,因为FirstOrDefault() 可以返回 null。

那么,谁错了,我还是 Resharper?

【问题讨论】:

  • 这看起来不错。你最好的判断总是会在这里覆盖 Resharper...
  • ReSharper 是一个很棒的工具,但这并不意味着你必须做它说你应该做的所有事情。 :-) 顺便说一句,如果您将代码和 ReSharper 建议的代码并排放置,那就太好了。但是,实际答案可能是个人喜好,并且您认为更具可读性。有时我喜欢 ReSharper 所做的事情,有时我不喜欢(我撤消了它)。
  • 嗯.. var bar = foo != null && foo.SomeBool 怎么样?
  • 只是好奇.. ReSharper 只是给你一个警告,还是它实际上暗示了什么?
  • @dema80 这只是一个警告(绿色下划线)

标签: c# asp.net resharper


【解决方案1】:

首先,一个完整的例子:

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# 不会自动确定它始终为空或非空。

现在,正如你在这一行所说的:

        var bar = foo != null ? foo.SomeBool : false;

R# 提供检查简化条件运算符。这是什么意思?好吧,像往常一样,我们可以 Alt+Enter 并接受建议,看看它想用什么替换它,在这种情况下是:

        var bar = foo != null && foo.SomeBool;

现在,关于您的担忧:

但我觉得这里有必要进行 null 检查,因为 FirstOrDefault() 可以返回 null。

那么,谁错了,我还是 Resharper?

嗯,简而言之,你就是。这里仍然进行空检查,并且 &amp;&amp; 运算符短路,因此第二个操作数 (foo.SomeBool) 只有在第一个操作数是 @987654330 时才会计算@。所以在foonull的情况下不会有NullReferenceException;第一次检查将失败,bar 将被分配false

这两行

        var bar = foo != null ? foo.SomeBool : false;

        var bar = foo != null && foo.SomeBool;

语义等价,而 R# 像往常一样更喜欢更简洁的版本(特别是,条件句中的显式 trues 和 falses 通常是冗余代码的标志)。您可能不会,在这种情况下,您可以关闭此检查。

【讨论】:

    【解决方案2】:

    ReSharper 建议将您的代码更改为:

    var bar = foo != null && foo.SomeBool;
    

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

    【讨论】:

    • 更快,但只是评论.. :) 我的傻瓜
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2019-10-27
    • 2021-10-02
    相关资源
    最近更新 更多