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