【问题标题】:Is there a point to using the C# discard operator for method return values?将 C# 丢弃运算符用于方法返回值是否有意义?
【发布时间】:2019-05-04 17:09:29
【问题描述】:

Visual Studio 2019 的代码分析和代码建议开始突出显示我调用返回值但根本不使用该值的方法的每一行代码,并告诉我使用丢弃运算符_

我不完全理解为什么这很重要,甚至对于 Fluent API 样式代码来说似乎是错误的。

以下两行在功能上有区别吗?

private int SomeMethod() => 0;
...
SomeMethod();
_ = SomeMethod();
...

如果返回值是一个引用会更重要吗?如果没有,有没有办法全局禁用此检查?

【问题讨论】:

  • 你可能想在this GitHub issue 报告你的想法,它正在讨论诊断是否过于激进。
  • @MartinUllrich 在您对链接发表评论后就这样做了,谢谢!

标签: c# .net operator-keyword


【解决方案1】:

摘自Microsoft Documentation

从 C# 7.0 开始,C# 支持丢弃,这是临时的、虚拟的 有意在应用程序代码中未使用的变量。丢弃 等价于未赋值的变量;它们没有价值。 因为只有一个丢弃变量,而该变量可能 甚至不被分配存储,丢弃可以减少内存分配。 因为它们使您的代码的意图清晰,它们增强了它的 可读性和可维护性。

所有代码分析都是为了帮助改进整体编码。有时我们会在项目早期编写返回简单值的快速方法。在重构期间,无论出于何种原因,我们都会停止使用此类变量。代码分析只是指出了这一点。作为开发人员,您可以说,嘿,让我重构方法以不返回变量,因为我们不需要它。这完全取决于您团队的开发风格。

验证您的问题,我运行的是 VS2019 16.0.0 Preview 5.0,问题就在那里。

根据@MartinUllrich 的评论,我升级到了 16.1.0 预览版 2.0。警告消失了。您也可以禁用警告using #pragma directive

您还可以禁用源文件顶部的警告:

你也suppress warnings for the whole project

【讨论】:

  • 请参阅this GitHub issue,尽管新引入的诊断过于激进,它被标记为 16.1(VS 2019 更新 1)里程碑。
  • 据我所知,这不是设计/重构问题——我确实根据需要在某些地方使用了返回值,但并非总是如此——这是 Fluent API 风格方法的基础。这种诊断似乎过于激进地暗示这些用法应该更冗长,而不是更少。它也不符合丢弃的代码样式描述。正如@MartinUllrich 提到的,这可能会得到解决。现在,对我来说,用#pragma 行隐藏每一行代码似乎比使用丢弃运算符更糟糕,所以我认为目前还没有解决方案。
  • 不必为每一行都隐藏它。您可以为整个文件隐藏它。
  • @RanSagy,您也可以为项目抑制。我更新了答案。
【解决方案2】:

解决这个无用警告(或至少管理不善)的最佳方法是在项目根目录的 GlobalSuppressions.cs 文件中抑制它:

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE0058")]

我有一个版本 16.3.0 Preview 3.0 问题依旧存在。

【讨论】:

    猜你喜欢
    • 2019-02-16
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2012-04-22
    • 2021-05-28
    • 2020-05-17
    • 1970-01-01
    相关资源
    最近更新 更多