Nie sądzę, aby to pytanie było wcześniej zadawane. Jestem nieco zdezorientowany, jeśli chodzi o najlepszy sposób implementacji IDisposable
na zamkniętej klasie, zamkniętej klasie, która nie dziedziczy po klasie bazowej. (Oznacza to "czystą zamkniętą klasę", która jest moim wymyślonym terminem.)Implementacja IDisposable w zamkniętej klasie
Być może niektórzy zgadzają się ze mną, że wytyczne dotyczące wdrażania IDisposable
są bardzo mylące. Powiedział, że chcę wiedzieć, że sposób, w jaki zamierzam wdrożyć IDisposable
jest wystarczający i bezpieczny.
Zrobiłem kod P/Invoke, który przydziela IntPtr
do Marshal.AllocHGlobal
i oczywiście, chcę czysto pozbyć się niezarządzanej pamięci, którą stworzyłem. Więc mam na myśli coś takiego
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();
}
}
jestem przy założeniu, że z powodu MemBlock
jest całkowicie szczelny i nie wywodzi się z innej klasy, która realizuje virtual protected Dispose(bool disposing)
nie jest konieczne.
Czy finalizator jest absolutnie niezbędny? Wszystkie myśli mile widziane.
Ale oczywiście w przypadku, gdy zamknięta klasa wywodzi się z klasy bazowej, wówczas konieczna byłaby wirtualna utylizacja - poprawna? – zebrabox
Również. Finalizator oznacza dodanie do kolejki finalizatora i konieczność efektywnego podwójnego zbierania śmieci. Wydaje się, że trzeba zapłacić wysoką cenę za niewykorzystane zasoby. Czy nie ma sposobu, aby uniknąć uderzenia wydajności? – zebrabox
W takim przypadku "przesłonisz" metodę. Nie możesz zadeklarować żadnych metod w klasie 'zapieczętowanej' jako' wirtualnej'. Jest to błąd ** kompilatora **. –