强制非 void 返回方法始终分配给变量或丢弃

Enforce non-void returning methods to always assign to a variable or discard

通常我有这样的代码片段:

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

在这种情况下,ChangeLanguage(...) 方法 returns 一个值,尽管未使用该值(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

有选项:

Option values discard_variable - Prefer to assign an unused expression to a discard

unused_local_variable - Prefer to assign an unused expression to a local variable that is never used

以后的读者请参考代码规则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 应该已经涵盖了这个用例,所以我不会在这方面投入更多精力。如果你出于某种原因需要这个,请随时创建一个问题,我可能会看看。

此外,存储库未发布或其他内容,因此您必须自己克隆和构建它。

P.s。一旦掌握了 Roslyn 分析器,它们就会非常棒。