私はこの質問が以前に聞かれたとは思わない。私は密閉されたクラス、具体的には、ベースクラスから継承しない密閉クラスにIDisposable
を実装する最良の方法について少し混乱しています。 (すなわち、私の作った「純粋な封印されたクラス」です)封印されたクラスにIDisposableを実装する
IDisposable
を実装するためのガイドラインは非常に混乱していると思いますか?それは、私がIDisposable
を実装しようとしている方法が十分で安全であることを知りたいと思っています。
IntPtr
からMarshal.AllocHGlobal
までを割り当てるP/Invokeコードを実行していますが、私が作成した管理されていないメモリをきれいに処分したいと思います。だから私は、私はMemBlock
が完全に密封され、決してvirtual protected Dispose(bool disposing)
を実装する必要がないことを別のクラスから派生しているためと仮定しています。この
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();
}
}
のようなものと思っています。
また、ファイナライザは厳密に必要ですか?すべての考えは大歓迎です。
もちろん、ベースクラスから派生した密閉クラスでは、仮想ディスポースが必要でしょうか? – zebrabox
また、ファイナライザーとは、ファイナライザ・キューに追加し、実質的に二重のガベージ・コレクトのオーバーヘッドを持つことを意味します。管理されていないリソースの使用に対しては、大きなペナルティがかかるようです。パフォーマンスヒットを避ける方法はありませんか? – zebrabox
この場合、メソッドをオーバーライドします。 'sealed'クラスのメソッドを' virtual'として宣言することはできません。これはコンパイラエラー**です。 –