【发布时间】:2018-06-14 04:42:21
【问题描述】:
考虑以下代码:
public class Test
{
public async Task Do()
{
await Task.Delay(200);
using (var disposable = new Disposable())
{
disposable.Do();
}
}
}
public class Disposable : IDisposable
{
public void Do()
{
}
public void Dispose()
{
}
}
当我在 Visual Studio 中运行代码分析时,我收到一条警告:
警告 CA1001 在测试时实施 IDisposable。d__0 因为它创建了以下 IDisposable 类型的成员:'Disposable'。
为什么我会收到此消息? Disposable 类已正确处理,我不会将其存储在任何地方。
此外,这对分析器来说似乎没问题:
public class Test
{
public void Do()
{
using (var disposable = new Disposable())
{
disposable.Do();
}
}
}
【问题讨论】:
-
可以说是分析器中的一个错误。编译器将其转换为状态机代码,其中一次性被提升到一个闭包类中,将变量公开为一个字段,然后代码分析会发出警告。它不知道编译器生成的代码在任何情况下都会处理对象,并且该类不打算由客户端处理。由于用户显然无法在任何情况下修改编译器生成的代码,因此警告毫无意义(即使编译器生成的代码应该包含错误!)
标签: c# .net visual-studio async-await code-analysis