I c# 一般に、オブジェクトは GC が望むときに破棄されるため、強制的に破棄する方法はありません。怠け者ですが、あなたのメモリが不足することは許しません。したがって、破棄されると予想されるオブジェクトは、収集する準備ができていません。準備ができていないということは、アプリケーションのどこかにこのオブジェクトへの参照があることを意味します。これらの参照の一部は、プロセス全体に存在するクラス内のフィールドとして明らかですが、他の参照はこれを考慮して見つけるのが困難です。
class LongLivingClass // say main window or some other
// instance that lives considerably longer then the other
{
public event Action SomeEvent;
}
class ShortLivingClass // class that is created and should be destroyed
// many times throughout life of LongLivingClass
{
ShortLivingClass(LongLivingClass llc)
{
llc.SomeEvent += DoSomething;
}
void DoSomething(){/*.../*}
}
それShortLivingClass
までに公開されたイベントにアタッチするLongLivingClass
と、dispose メソッドでこのハンドラーを削除しない限り、破棄されません。
void Dispose()
{
llc.SomeEvent -= DoSomething;
}
IDisposable
インターフェイスは、デストラクタのようなランタイムによって強制されないパターンの一部であることに注意してください。呼び出す場所と時間を決定する必要があります。
また、変数をキャプチャするクロージャにも注意してください。それらの変数がインスタンス フィールドである場合は、インスタンスもキャプチャされます。
長期的には、Web で C# のメモリ リークを検索する必要があります。SO では、この幸運を考えると多くの質問があります。