ReSharper ' MergeSequentialChecks '和' MergeSequentialChecksW

本文关键字:MergeSequentialChecksW MergeSequentialChecks ReSharper | 更新日期: 2023-09-27 18:13:42

我想弄清楚这两个规则的区别是什么?

  • 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();
    }
}

ReSharper ' MergeSequentialChecks '和' MergeSequentialChecksW

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

当我们第一次实现c# 6.0相关的代码建议和转换,并在我们可用的大解决方案中审查它们的结果时,我们决定,大约2/3的检查(如"合并顺序检查"/"使用null传播")不应该建议进行代码转换。例如,我们认为在这样的代码中:

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("!!!");
}

注。当转换可能时,上下文操作"合并顺序检查"/"到null传播"总是被启用,而不管代码检查的状态和它们的严重性。

相关文章:
  • 没有找到相关文章