0

まず、これはコンパクトなフレームワーク 3.5 アプリケーションです。

私は非常に奇妙な問題を抱えています。Dispose-Method では、アプリケーションはコレクション内のアイテムを破棄し、その後リストをクリアします。これまでのところ特別なことは何もなく、私のアプリケーションによって Dispose が呼び出されたときに魅力的に機能します。しかし、ガベージ コレクターが同じ Dispose-Method を呼び出す Finalizer を呼び出すとすぐに、システムはジェネリック コレクションの Clear-Method で NotSupported-Exception をスローします。

Dispose-Method の本体は次のとおりです。

public override void Dispose()
{
    if (items != null)
    {
        foreach (Shape item in items)
        {
            item.Dispose();
        }
        items.Clear();
        items = null;
    }
    base.Dispose();
}

私はここで完全に立ち往生しています。誰かが私にこれを説明してくれるかもしれませんし、同様の問題を抱えて解決したかもしれません。

4

1 に答える 1

0

ファイナライザーは、クリーンアップするアンマネージ リソースがある場合にのみ Dispose を呼び出す必要があります。ファイナライザーから呼び出された場合、マネージド リソースにアクセスすることはできません。

上記のコメントで述べたように、クラスがファイナライザーを実装する必要がある [私たちが確認できる] 理由はありません。

参考までに、ファイナライザーを使用する必要がある場合は、Dispose パターンを次のように使用します。

// The finalizer
~MyClass()
{
    Dispose(false);
}

// The IDisposable implemenation
public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

// The "real" dispose method
protected virtual void Dispose(bool disposing)
{
    if (!_disposed)
    {
        if (disposing)
        {
            // Dispose managed objects here
        }
        else
        {
            // Free unmanaged resources here
        }
        _disposed = true;
    }
}
于 2012-06-20T19:38:49.500 に答える