代码之家  ›  专栏  ›  技术社区  ›  zebrabox

在密封类上实现IDisposable

  •  29
  • zebrabox  · 技术社区  · 16 年前

    IDisposable

    可释放 可释放

    IntPtr Marshal.AllocHGlobal 当然,我想干净地处理我创建的非托管内存。所以我在想这样的事情

    using System.Runtime.InteropServices;
    
    [StructLayout(LayoutKind.Sequential)]
    public sealed class MemBlock : IDisposable
    {
         IntPtr ptr;
         int length;
    
         MemBlock(int size)
         {
               ptr = Marshal.AllocHGlobal(size);
               length = size;
         }
    
         public void Dispose()
         {
              if (ptr != IntPtr.Zero)
              {
                   Marshal.FreeHGlobal(ptr);
                   ptr = IntPtr.Zero;
                   GC.SuppressFinalize(this);
              }
         }
    
         ~MemBlock()
         {
               Dispose();
         }    
    }
    

    MemBlock 完全密封,从不从实现 virtual protected Dispose(bool disposing) 没有必要。

    4 回复  |  直到 10 年前
        1
  •  13
  •   Mehrdad Afshari    16 年前

    Dispose .

    virtual sealed protected

        2
  •  8
  •   Marc Gravell    16 年前

    轻微的增加;在 Dispose(bool disposing) Dispose

    例如:

     public void Dispose() { Dispose(true); }
     ~MemBlock() { Dispose(false); }
     void Dispose(bool disposing) { // would be protected virtual if not sealed 
         if(disposing) { // only run this logic when Dispose is called
             GC.SuppressFinalize(this);
             // and anything else that touches managed objects
         }
         if (ptr != IntPtr.Zero) {
              Marshal.FreeHGlobal(ptr);
              ptr = IntPtr.Zero;
         }
     }
    
        3
  •  7
  •   TrueWill    16 年前

    Joe Duffy's Weblog :

    不被跟踪,意味着你应该 用简单的方法处理(即。 实施最终确定和

    所以,是的,你应该表现得很好。

    SafeHandle 。我对P/Invoke没有足够的经验来建议正确的用法。

        4
  •  1
  •   codymanix    16 年前

    呼叫GC。出于显而易见的原因,从终结器中抑制终结(this)是不必要的,但它不会造成伤害。

    在处理非托管资源时,拥有一个终结器是必不可少的,因为它们不会自动释放,你必须在终结器中使用它。在对象被垃圾回收后,它会自动调用。