ReSharper`MergeSequentialChecks`和`MergeSequentialChecks WhenPossible`有什么区别? [英] What's the difference between ReSharper `MergeSequentialChecks` and `MergeSequentialChecksWhenPossible`?

查看:30
本文介绍了ReSharper`MergeSequentialChecks`和`MergeSequentialChecks WhenPossible`有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试弄清楚这两条规则有什么不同?

  • MergeSequentialChecks
  • MergeSequentialChecksWhenPossible

文档没有提到第二个。 https://www.jetbrains.com/help/resharper/2016.1/MergeSequentialChecks.html

我不清楚WhenPossible是什么意思?

如果ReSharper建议应用第一个规则并合并我的顺序检查,那么这确实是可能的。这怎么可能呢?

下面是要检查的代码示例。

public class Person
{
    public string Name { get; set; }
    public IList<Person> Descendants { get; set; }
}

public static class TestReSharper
{
    // Here `MergeSequentialChecks` rule is triggered for both `&&` operands.
    public static bool MergeSequentialChecks(Person person)
    {
        return person != null && person.Descendants != null && person.Descendants.FirstOrDefault() != null;
    }

    // Here `MergeSequentialChecksWhenPossible` rule is triggered.
    public static bool MergeSequentialChecksWhenPossible1(Person person)
    {
        return person != null && person.Descendants.Any();
    }

    // Here `MergeSequentialChecksWhenPossible` rule is triggered.
    public static bool MergeSequentialChecksWhenPossible2(Person person)
    {
        return person.Descendants != null && person.Descendants.Any();
    }
}

推荐答案

使用"(如果可能)"标签进行代码检查背后的想法很简单:我们决定不建议使用默认R#设置进行可能的代码转换,因为生成的代码可能会导致可读性降低或变得更难理解。这个关于建议或不建议的决定是通过特别启发式完成的。

当我们第一次实现与C#6.0相关的代码建议和转换,并在我们可用的大型解决方案中审查他们的结果时,我们决定几乎2/3的检查(如"合并顺序检查"/"使用空传播")不应该建议进行代码转换。例如,我们认为在如下代码的情况下:

if (node != null && node.IsValid()) { ... }

...在bool?类型的值上使用?.运算符和引入"提升"operator==(bool, bool)运算符没有实际好处:

if (node?.IsValid() == true) { ... }

另外,不同的开发人员对如何检查bool?类型的值为true有不同的看法(有些人更喜欢使用?? false,但这会使结果代码even?.more ?? questionable)。

因此,在上面的情况下,顺序检查的合并肯定是"可能的",但我们不会推荐使用默认的R#设置(正确的默认设置是一项巨大的责任),使用户能够通过启用相同代码检查的"(如果可能)"版本来查看所有情况。据我所知,目前我们在"合并顺序检查"检查中只检查没有产生提升的布尔检查,其他检查有更多的启发式检查,例如:

if (stringBuilder != null) { // "Use null propagation"
  stringBuilder.Append("hello");
}

以上值得建议使用条件调用运算符的代码:

stringBuilder?.Append("hello");

按顺序使用条件调用两次或更多次是有问题的...

if (stringBuilder != null) { // no suggestion
  stringBuilder.Append("hello");
  stringBuilder.Append("world");
  stringBuilder.Append("!!!");
}

附注:当转换可能时,上下文操作"合并顺序检查"/"到空传播"始终被启用,而不管代码检查的状态及其严重性。

这篇关于ReSharper`MergeSequentialChecks`和`MergeSequentialChecks WhenPossible`有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆