Ich glaube nicht, dass diese Frage zuvor gestellt wurde. Ich bin ein wenig verwirrt über die beste Möglichkeit, IDisposable
auf einer versiegelten Klasse zu implementieren - speziell eine versiegelte Klasse, die nicht von einer Basisklasse erbt. (Das heißt, eine "reine versiegelte Klasse", die meine Bezeichnung ist.)Implementieren IDisposable auf einer versiegelten Klasse
Vielleicht stimmen einige von Ihnen darin überein, dass die Richtlinien für die Implementierung IDisposable
sehr verwirrend sind. Das heißt, ich möchte wissen, dass die Art, wie ich vorhabe, IDisposable
zu implementieren, ausreichend und sicher ist.
Ich mache einige P/Invoke-Code, der eine IntPtr
durch Marshal.AllocHGlobal
zuweist und natürlich möchte ich den nicht verwalteten Speicher, den ich erstellt habe sauber zu entsorgen. So denke an Ich bin so etwas wie dies
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();
}
}
Ich gehe davon aus, dass, weil MemBlock
vollständig abgedichtet ist und nie von einer anderen Klasse abgeleitet wird, dass ein virtual protected Dispose(bool disposing)
Implementierung ist nicht erforderlich.
Ist der Finalizer auch unbedingt erforderlich? Alle Gedanken willkommen.
Aber natürlich wäre in dem Fall, dass eine versiegelte Klasse von einer Basisklasse abgeleitet wäre, eine virtuelle Dispose notwendig - richtig? – zebrabox
Auch. Der Finalisierer bedeutet, dass er zu einer Finalizer-Warteschlange hinzugefügt wird und den Overhead einer effektiven doppelten Müllsammlung aufweist. Es scheint eine schwere Strafe für die Verwendung von nicht verwalteten Ressourcen zu zahlen. Gibt es keine Möglichkeit, den Leistungseinbruch zu vermeiden? – zebrabox
In diesem Fall würden Sie die Methode überschreiben. Sie können keine Methoden in einer "versiegelten" Klasse als "virtuell" deklarieren. Es ist ein Compiler ** Fehler **. –