【问题标题】:Enforce non-void returning methods to always assign to a variable or discard强制非 void 返回方法始终分配给变量或丢弃
【发布时间】:2020-12-01 13:22:30
【问题描述】:

我的代码片段通常如下所示:

        private void OnChangeLanguageCommandExecuted(object obj)
        {
            pLngService.ChangeLanguage(newLcid);
        }

在这种情况下,ChangeLanguage(...) 方法会返回一个值,尽管没有使用该值(true 表示成功,false 表示不成功)。问题是,在查看此方法返回值的代码时,我不知道。

方法不是我写的,也不是我控制的。

因此,我想在全球范围内执行一项政策:

必须为每个非 void 返回方法分配一个变量,例如 var unused = pLngService.ChangeLanguage(newLcid);

或者应该使用丢弃操作符,使其更明确: _ = pLngService.ChangeLanguage(newLcid);

我当然愿意接受其他建议,这里的主要目标是更详细地说明一个方法返回一个值并且我选择丢弃它。

我希望 Visual Studio 或 Resharper 有一个规则,我可以通过生成编译器警告来执行此策略。我不想让它成为编译器错误,这似乎很严格。我快速环顾四周,但没有发现任何东西,但我觉得我忽略了一些东西。

我正在使用 vs2017 (net4) 和 vs2019 (net8/netcore3.0) 中的项目,所以在这两种设置中都可以使用的东西会很棒。

编辑: 我发现,实际上是在编写 roslyn 代码分析器时,您可以使用 https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0058

进行配置

代码修复正是我想要的:

// Original code:
System.Convert.ToInt32("35");

// After code fix for IDE0058:

// csharp_style_unused_value_expression_statement_preference = discard_variable
_ = System.Convert.ToInt32("35");

// csharp_style_unused_value_expression_statement_preference = unused_local_variable
var unused = Convert.ToInt32("35");

有如下规则:

csharp_style_unused_value_expression_statement_preference

有选项:

选项值 discard_variable - 更喜欢将未使用的表达式分配给丢弃

unused_local_variable - 更喜欢将未使用的表达式分配给从未使用过的局部变量

【问题讨论】:

  • 您通过执行这样的规则解决了什么问题?更容易的代码审查?还有什么?如果忽略返回值,我个人认为没有问题。这就是自 2002 年以来 C# 的工作方式。
  • @canton7 有趣的话题,谢谢。关于方法的名称,再一次,它不在我的控制之下,所以我完全同意,我使用的整个框架充满了命名错误的方法,但我无法改变这一点。这就是为什么我想要像我所说的那样的政策......
  • @Sinatr 我还没有看到那个属性,一个很好的建议。但是我仍然无法控制我正在调用的很多方法(它们位于不同的混淆 dll 中),所以那里没有运气。
  • @canton7 我也没有看到任何可用的 roslyn 分析器。它们看起来很容易写,但是如果我有时间的话,也许我会把它当作一个周末项目。已经有分析器可以避免 Async void 方法,因此应该很容易从那里适应,例如github.com/TheAlmightyBob/AsyncVoidAnalyzer/blob/master/…

标签: c# resharper


【解决方案1】:

以后的读者请参考代码规则IDE0058: https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0058 另请参阅:https://docs.microsoft.com/nl-nl/dotnet/fundamentals/code-analysis/code-style-rule-options?view=vs-2019 了解如何配置编辑器规则。

这应该可以满足您的需求。如果那不可用,或者您的特定 VS 版本中的规则有问题,您还可以查看我在星期六早上制作的这个快速 roslyn 分析器:

https://github.com/sommmen/DiscardReturnValueAnalyzer/tree/master

她在工作,但仍有一些我不满意的地方,比如实际的分析消息。但是由于 IDE0059 应该已经涵盖了这个用例,所以我不会在这方面投入更多精力。如果您出于某种原因需要此功能,请随时创建问题,我可能会查看。

repo 也没有发布或者其他什么,所以你必须自己克隆和构建它。

附:一旦你掌握了 Roslyn 分析仪的窍门,它们就会非常棒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多