CA1001: I tipi proprietari di campi Disposable devono essere Disposable
TypeName |
TypesThatOwnDisposableFieldsShouldBeDisposable |
CheckId |
CA1001 |
Category |
Microsoft.Design |
Breaking Change |
Non sostanziale - Se il tipo non è visibile all'esterno dell'assembly. Sostanziale - Se il tipo è visibile all'esterno dell'assembly. |
Causa
Una classe dichiara e implementa un campo di istanza che corrisponde a un tipo System.IDisposable e la classe non implementa IDisposable.
Descrizione della regola
Una classe implementa l'interfaccia IDisposable per eliminare le risorse non gestite di cui è proprietaria. Un campo di istanza che corrisponde a un tipo IDisposable indica che il campo è proprietario di una risorsa non gestita. Una classe che dichiara un campo IDisposable è indirettamente proprietaria di una risorsa non gestita e dovrebbe implementare l'interfaccia IDisposable. Se la classe non è direttamente proprietaria di risorse non gestite, non dovrebbe implementare un finalizzatore.
Come correggere le violazioni
Per correggere una violazione di questa regola, implementare IDisposable e dal metodo IDisposable.Dispose chiamare il metodo Dispose del campo.
Esclusione di avvisi
Non escludere un avviso da questa regola.
Esempio
Nell'esempio riportato di seguito vengono illustrate due classi: una che viola la regola e una che la soddisfa mediante l'implementazione di IDisposable. La classe non implementa un finalizzatore in quanto non è direttamente proprietaria di risorse non gestite.
Imports System
Imports System.IO
Namespace DesignLibrary
' This class violates the rule.
Public Class NoDisposeMethod
Dim newFile As FileStream
Sub New()
newFile = New FileStream("c:\temp.txt", FileMode.Open)
End Sub
End Class
' This class satisfies the rule.
Public Class HasDisposeMethod
Implements IDisposable
Dim newFile As FileStream
Sub New()
newFile = New FileStream("c:\temp.txt", FileMode.Open)
End Sub
Overloads Protected Overridable Sub Dispose(disposing As Boolean)
If disposing Then
' dispose managed resources
newFile.Close()
End If
' free native resources
End Sub 'Dispose
Overloads Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub 'Dispose
End Class
End Namespace
using System;
using System.IO;
namespace DesignLibrary
{
// This class violates the rule.
public class NoDisposeMethod
{
FileStream newFile;
public NoDisposeMethod()
{
newFile = new FileStream(@"c:\temp.txt", FileMode.Open);
}
}
// This class satisfies the rule.
public class HasDisposeMethod: IDisposable
{
FileStream newFile;
public HasDisposeMethod()
{
newFile = new FileStream(@"c:\temp.txt", FileMode.Open);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// dispose managed resources
newFile.Close();
}
// free native resources
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}
Regole correlate
CA2213: I campi Disposable devono essere eliminati
CA2216: I tipi Disposable devono dichiarare un finalizzatore
CA2215: I metodi Dispose devono chiamare il metodo Dispose della classe base
CA1049: I tipi delle risorse native devono essere Disposable