gpt4 book ai didi

c# - ReSharper `MergeSequentialChecks` 和 `MergeSequentialChecksWhenPossible` 有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 20:19:45 25 4
gpt4 key购买 nike

我想弄清楚这两个规则之间有什么区别?

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

...使用 ?. 并没有真正的好处运营商和“解除”的介绍operator==(bool, bool)运算符超过 bool? 的值输入:

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

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

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

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

附注上下文操作“合并顺序检查”/“到空传播”总是在可以进行转换时启用,不管代码检查的状态及其严重性如何。

关于c# - ReSharper `MergeSequentialChecks` 和 `MergeSequentialChecksWhenPossible` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40135936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com