CA1822 错误地应用于发布模式下的 [TestMethod] 异步任务方法?

Posted

技术标签:

【中文标题】CA1822 错误地应用于发布模式下的 [TestMethod] 异步任务方法?【英文标题】:CA1822 is incorrectly applied to [TestMethod] async Task methods in Release Mode? 【发布时间】:2016-12-03 12:49:06 【问题描述】:

我正在使用一个自定义 RuleSet,它已将 CA1822 作为错误打开。

我有一个异步测试方法,所以它返回一个任务。此方法不使用任何字段,因此代码分析标记规则 CA1822,将其标记为静态。 但是 MSTest 不能调用静态异步任务方法(未在测试资源管理器中列出)。 因此,这似乎是代码分析逻辑中的一个缺陷。我对 C# 相当陌生,所以我尽可能地遵循代码分析,当我觉得我应该打破规则时进行抑制。但这是我第一次发现自己认为这个规则完全是错误的。

[TestMethod]
public async Task TestMethod1()

    await Task.Delay(10);




Severity    Code    Description Project File    Line    Suppression State
Error   CA1822  The 'this' parameter (or 'Me' in Visual Basic) of 'UnitTest1.TestMethod1()' is never used. Mark the member as static (or Shared in Visual Basic) or use 'this'/'Me' in the method body or at least one property accessor, if appropriate.   

我是否遗漏了规则中的某些内容?或者这只是一个角落 没有测试的情况?

尝试了更多的条件,似乎只是发布模式的问题。在调试模式下,它从不标记 CA1822。 如果我的 testMethod 不是异步的,那么该规则永远不会应用于调试或发布模式。

所以我想我应该提到这是在工作室 2015 企业 RC3 中。

这对我来说表明这是 RuleSet 中的一个极端案例,但我想听听其他人的想法。

【问题讨论】:

调试和发布生成的代码略有不同。如果您真的感兴趣 - 查看发布代码的 IL 并查看如何为 async 重写方法 - 您可能会发现在发布中没有使用 this。 (也可以作为自我回答提供一些有趣的信息) 我认为您正在做某事,但我对此了解的不够多,无法理解。查看调试和发布 IL 的差异,调试扩展对象,而发布扩展 ValueType。更具体地说,在调试中,我的 [TestMethod] 在:类 UnitTestProject4.UnitTest1,但在发布模式下,它是 valuetype UnitTestProject4.UnitTest1。我不太了解其中的含义,但我认为您是对的,这是关键的区别。 【参考方案1】:

规则来自性能集,从性能角度来看,将规则设为静态会更快。可能有 1000 个原因,在这种情况下,单元测试方法是其中之一,这可能会导致您不应用此规则。

我个人已经为大多数项目关闭了这条规则。在许多情况下,它会导致糟糕的面向对象设计,即使它执行得更快一点。来自文档的一点评论:

在某些情况下,无法访问当前对象实例表示正确性问题。

这通常是一个更正确的评论,尽管它不适用于这种情况。

【讨论】:

以上是关于CA1822 错误地应用于发布模式下的 [TestMethod] 异步任务方法?的主要内容,如果未能解决你的问题,请参考以下文章

横向模式下的增强现实应用程序

Flutter:使用 minifyEnabled 的发布模式下的 Firestore 不可用错误

调试模式下的directx音频视频错误消息

在调试模式下意外发布的 iOS 应用程序

后台模式下的多点连接

Unity 远程加载资源以及本地缓存相关