问题描述
我正在尝试弄清楚这两条规则有什么不同?
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
)。
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`有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!