考虑以下代码:
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中运行代码分析时,会收到警告:
为什么会收到此消息?一次性类已正确处理,我不会将其存储在任何地方。
此外,这对于分析器来说似乎可以:
public class Test
{
public void Do()
{
using (var disposable = new Disposable())
{
disposable.Do();
}
}
}
最佳答案
这是因为编译器从您的async方法生成状态机,并且该状态机类(在本例中为<Do>d__0
)包含类型Disposable
的字段,但本身并未实现IDisposable
接口(interface)。对于分析器来说,分析编译器生成的代码没有多大意义(并且<Do>d__0
类已标记为CompilerGenerated
属性)。幸运的是,代码分析器有一个设置可以避免编译器生成的代码:转到项目属性的“代码分析”选项卡,然后选中“禁止生成的代码结果”,此警告将消失。