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.