【发布时间】: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/…