我不认为这个问题之前被问过。我有点困惑于在一个密封类上实现 IDisposable
的最佳方式,具体而言是在一个不从基类继承的密封类上实现(也就是我的杜撰术语“纯密封类”)。
也许你们中的一些人同意我所认为的实现 IDisposable
的指南非常令人困惑。话虽如此,我想知道我打算实现 IDisposable
的方式是否足够安全。
我正在编写一些使用 P/Invoke 代码,通过 Marshal.AllocHGlobal
分配 IntPtr
,自然而然,我希望能够清理掉我创建的非托管内存。所以我考虑这样做:
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)
不是必要的。
此外,finalizer严格上是否必要?欢迎所有的想法。
GC.SuppressFinalize
防止终结和它的开销。 - Mehrdad Afshari