What#39;s the difference between ReSharper `MergeSequentialChecks` and `MergeSequentialChecksWhenPossible`?(ReSharper`MergeSequentialChecks`和`MergeSequentialChecks WhenPossible`有什么区别?)
问题描述
我正在尝试弄清楚这两条规则有什么不同?
MergeSequentialChecksMergeSequentialChecksWhenPossible
文档没有提到第二个。 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`有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:ReSharper`MergeSequentialChecks`和`MergeSequentialChecks WhenPossible`有什么区别?
基础教程推荐
- 全局 ASAX - 获取服务器名称 2022-01-01
- 首先创建代码,多对多,关联表中的附加字段 2022-01-01
- 从 VS 2017 .NET Core 项目的发布目录中排除文件 2022-01-01
- 是否可以在 asp classic 和 asp.net 之间共享会话状态 2022-01-01
- 将事件 TextChanged 分配给表单中的所有文本框 2022-01-01
- 如何动态获取文本框中datagridview列的总和 2022-01-01
- 在 VS2010 中的 Post Build 事件中将 bin 文件复制到物 2022-01-01
- 经典 Asp 中的 ResolveUrl/Url.Content 等效项 2022-01-01
- JSON.NET 中基于属性的类型解析 2022-01-01
- 错误“此流不支持搜索操作"在 C# 中 2022-01-01
