2

次のようなリソースを担当する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 のファイナライザーとデストラクタの名前付けと使用法が混乱しているため、何かを混同していると思います。誰か教えてくれませんか?:)

4

2 に答える 2

0

お役に立てれば:

c++ /cli に IDisposable を自動的に継承させるデストラクタを追加します。

次に、IDisposable にキャストして Dispose メソッドにアクセスします。

((IDisposable)obj).Dispose();

PS C# Dispose() に関しては、using ステートメントを使用して、またはもちろん手動で呼び出されます。それ以外の場合は、自動的に呼び出されません。C++/CLI で等価の using が Dispose() を呼び出さない理由がわかりません。

于 2013-05-13T12:42:16.970 に答える