考虑以下代码:

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属性)。幸运的是,代码分析器有一个设置可以避免编译器生成的代码:转到项目属性的“代码分析”选项卡,然后选中“禁止生成的代码结果”,此警告将消失。

10-06 15:03