1

重複の可能性:
IDisposable インターフェイスの適切な使用

本、インターネット、およびスタックオーバーフローから質問に対する実際の回答を見つけようとしましたが、これまでのところ何も役に立たなかったので、意味をなすのに十分正確に問題を表現できることを願っています.

一般に、メモリを解放する方法の同じ基本的な使用法を常に見つけました。次のように、私はコード自体を理解しています:

public class MyClass : IDisposable
{
    bool disposed = false;
    public void Dispose()
    {
        if (!disposed)
        {
        Dispose(true);
        GC.SuppressFinalize(this);
        disposed = true;
        }
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
        //free managed ressources
        }
    // free other ressources
    }

    ~MyClass()
    {
        Dispose(false);
    }
}

メソッドが機能する方法は完全に理にかなっています。しかし今、私の質問: なぜ基本クラス IDisposable が必要なのですか? このコード サンプルでは、​​ というメソッドを定義しますDispose()。どこでもそのメソッドは IDisposable の一部であると読んでいますが、そのメソッドを内部で定義したばかりでMyClassあり、基本クラス IDisposable を実装しない場合、またはこの仮定が間違っている場合でも、このコードは機能しますか?

私は C# を初めて使用するわけではありませんが、まだ学ぶべきことがたくさんあるので、誰かが私を正しい方向に導いてくれることを願っています。同じ質問の別の投稿を確認しましたが、見つかりませんでした。もしそれが存在し、私の質問に答えている場合は、そこに誘導してください。この投稿を削除します。

4

4 に答える 4

2

IDisposable.Dispose の実際の実装は、Dispose(bool) の基本クラスの実装を呼び出します。このクラスから継承した人は、破棄する必要がある場合に備えて、次のタスクを実行する必要があります。

public override Dispose(bool disposing)
{
    base.Dispose(disposing);
    //my disposal code
}

このよく知られているパターンを使用すると、継承者は基本クラスの破棄を壊すことなく破棄コードを拡張できます。

多くの場合、破棄するアンマネージ リソースがなく、クラスを封印する余裕がある場合は、次のコードを使用して問題を簡素化できます。

public sealed class SomeDisposable:IDisposable
{
    public void Dispose()
    {
       //just go ahead and clean up
       //because we're sealed, no-one can ever break
       //this code via inheritance
    }
    //~SomeDisposable()
    //{
    //   if this is being called then it will be called
    //   on all referenced and unrooted IDisposables too
    //   If everything is managed, that means we've got nothing
    //   left to clean up, so we can omit this Finalizer 
    //}
}
于 2013-01-28T01:24:56.557 に答える
1

これはusing、C# コンパイラによってブロックと共に使用されます。

于 2013-01-28T01:24:05.637 に答える