Share via


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);
      }
   }
}

相關規則

CA2213:可處置的欄位應該受到處置

CA2216:可處置型別應該宣告完成項

CA2215:Dispose 方法應該呼叫基底類別處置

CA1049:擁有原生資源的型別應為可處置