CA1001 在异步方法上实现 IDisposable

CA1001 implement IDisposable on async method

考虑以下代码:

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 中进行代码分析时,我收到警告:

Warning CA1001 Implement IDisposable on Test.< Do>d__0 because it creates members of the following IDisposable types: 'Disposable'.

为什么我会收到这条消息?一次性 class 正确处理,我没有将它存放在任何地方。

此外,这对分析器来说似乎没问题:

public class Test
{
    public void Do()
    {
        using (var disposable = new Disposable())
        {
            disposable.Do();
        }
    }
}

如果您查看 IL,您会发现创建了一个 class <Do>d__0 来处理异步内容:

// Nested Types
.class nested private auto ansi sealed beforefieldinit '<Do>d__0'
    extends [mscorlib]System.Object
    implements [mscorlib]System.Runtime.CompilerServices.IAsyncStateMachine
{

稍后,此 class 创建 Disposable 的实例:

IL_0074: newobj instance void ConsoleApp1.Disposable::.ctor()

那是触发CA1001的class,因为CA1001检查IL,生成的class没有实现IDisposable。您可以安全地忽略此特定 class.

上的 CA1001 警告

那是因为编译器从您的异步方法生成状态机,并且该状态机 class(在本例中名为 <Do>d__0)包含类型为 Disposable 的字段,但它本身并不实现IDisposable界面。 analyzer 分析编译器生成的代码意义不大(而且这个 <Do>d__0 class 被标记为 CompilerGenerated 属性)。幸运的是,代码分析器有一个设置可以避免编译器生成代码:转到项目属性,"Code Analysis" 选项卡并选中 "Suppress results from generated code",此警告将消失。