Не думаю, что этот вопрос задавался раньше. Меня немного смущает лучший способ реализации 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)
не является необходимой.
Кроме того, действительно ли необходим финализатор? Все мысли приветствуются.