Я не думаю, что этот вопрос задавали раньше. Я немного смущен лучшим способом реализовать IDisposable
в закрытом классе - в частности, запечатанном классе, который не наследуется от базового класса. (То есть, "чистый закрытый класс", который является моим составленным термином.)
Возможно, некоторые из вас согласны со мной в том, что рекомендации по реализации IDisposable
очень сбивают с толку. Тем не менее, я хочу знать, что способ, которым я намерен реализовать IDisposable
, достаточно и безопасен.
Я делаю код P/Invoke, который выделяет 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)
не требуется.
Кроме того, обязательно нужно финализатор? Все мысли приветствуются.