Non penso che questa domanda sia stata posta prima. Sono un po 'confuso sul modo migliore per implementare IDisposable
su una classe chiusa, in particolare, una classe sigillata che non eredita da una classe base. (Cioè, una "classe sigillata pura" che è il mio termine inventato.)Implementazione IDisposable su una classe sigillata
Forse alcuni di voi sono d'accordo con me in quanto le linee guida per l'implementazione di IDisposable
sono molto confuse. Detto questo, voglio sapere che il modo in cui intendo implementare IDisposable
è sufficiente e sicuro.
Sto facendo un po 'di codice P/Invoke che assegna uno IntPtr
tramite Marshal.AllocHGlobal
e, naturalmente, voglio eliminare in modo pulito la memoria non gestita che ho creato. Così sto pensando a qualcosa di simile
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();
}
}
sto supponendo che perché MemBlock
è completamente sigillato e mai deriva da un'altra classe che l'attuazione di un virtual protected Dispose(bool disposing)
non è necessario.
Inoltre, il finalizzatore è strettamente necessario? Tutti i pensieri sono benvenuti
Ma ovviamente nel caso in cui una classe sigillata derivata da una classe base, allora sarebbe necessario un Dispose virtuale - corretto? – zebrabox
Inoltre. Il finalizzatore indica l'aggiunta a una coda di finalizzazione e il sovraccarico di un doppio raccoglitore di rifiuti effettivo. Sembra una pesante penalità da pagare per l'utilizzo di risorse non gestite. Non c'è modo di evitare il colpo di performance? – zebrabox
In tal caso, dovrai "sovrascrivere" il metodo. Non puoi dichiarare alcun metodo in una classe 'sealed' come' virtuale'. È un errore del compilatore **. –