metodo method how example c# .net visual-studio async-await code-analysis

c# - method - CA1001 implementa IDisposable en el método async



idisposable xamarin (2)

Considera seguir el código:

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() { } }

Cuando ejecuto un análisis de código en Visual Studio recibo una advertencia:

Advertencia CA1001 Implementar IDisposable en prueba. <Do> d__0 porque crea miembros de los siguientes tipos IDisposable: ''Desechables''.

¿Por qué recibo este mensaje? La clase desechable está dispuesta correctamente y no la guardo en ningún lado.

Además, esto parece estar bien para el analizador:

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


Esto se debe a que el compilador genera la máquina de estados a partir de su método async, y esa clase de máquina de estados (denominada <Do>d__0 en este caso) contiene un campo de tipo Disposable pero no implementa IDisposable interfaz IDisposable . No tiene mucho sentido que el analizador analice el código generado por el compilador (y esta clase <Do>d__0 está marcada con el atributo CompilerGenerated ). Afortunadamente, hay una configuración para que el analizador de código evite el código generado por el compilador: vaya a las propiedades del proyecto, pestaña "Análisis de código" y marque "Suprimir resultados del código generado", y esta advertencia desaparecerá.


Si miras el IL, encontrarás que se creó una clase <Do>d__0 para manejar las cosas asincrónicas:

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

Más adelante, esta clase crea una instancia de Desechable:

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

Esa es la clase que desencadena CA1001 porque CA1001 comprueba el IL, y la clase generada no implementa IDisposable . Puede ignorar con seguridad la advertencia CA1001 en esta clase en particular.