次のようなリソースを担当するC#オブジェクトがあります。
public sealed class CLoadingScope
{
private bool isDisposed;
public CLoadingScope()
{}
~CLoadingScope()
{
// must be disposed otherwise it is used incorrectly
if (!isDisposed)
{
throw new ApplicationException("RAII object has not been disposed");
}
}
public void Dispose()
{
// CLEANUP CODE HERE […]
isDisposed = true;
GC.SuppressFinalize(this);
}
};
次のような C++/CLI コードでこれを使用しています。
{
CLoadingScope scope;
// CODE THAT USES THE RESSOURCE HERE […]
}
しかし、これにより例外がスローされます。Dispose は C# クラスのデストラクタであり、スタック オブジェクトはスコープの最後で破棄されるため、これが機能することを期待していました。少なくとも、私はこの質問に対する答えをそのように解釈しました。C#、C++、および C++/CLI のファイナライザーとデストラクタの名前付けと使用法が混乱しているため、何かを混同していると思います。誰か教えてくれませんか?:)