CA1001:具有可處置欄位的型別應該是可處置的
型別名稱 |
TypesThatOwnDisposableFieldsShouldBeDisposable |
CheckId |
CA1001 |
分類 |
Microsoft.Design |
中斷變更 |
非中斷 - 如果不能在組件外部看見型別。 中斷 - 如果可以在組件外部看見型別。 |
原因
類別會宣告及實作型別為 System.IDisposable 的執行個體 (Instance) 欄位,且該類別不會實作 IDisposable。
規則描述
類別會實作 IDisposable 介面以處置 (Dispose) 它所擁有的 Unmanaged 資源。型別為 IDisposable 的執行個體欄位表示該欄位擁有 Unmanaged 資源。宣告 IDisposable 欄位的類別會間接擁有 Unmanaged 資源,且應實作 IDisposable 介面。如果類別不會直接擁有任何 Unmanaged 資源,則它不應實作完成項。
如何修正違規
若要修正此規則的違規情形,請實作 IDisposable,並從 IDisposable.Dispose 方法呼叫欄位的 Dispose 方法。
隱藏警告的時機
請勿隱藏此規則的警告。
範例
下列範例會透過實作 IDisposable 以顯示違反規則的類別,以及滿足規則的類別。因為該類別不會直接擁有任何 Unmanaged 資源,所以該類別不會實作完成項。
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);
}
}
}