6

クラスにIDisposableを実装するインスタンスフィールドがある場合、それを含むクラスはIDisposableを実装し、Disposeメソッド内からDisposeメソッドをフィールド化するクラスを実装します。

public class A : IDisposable 
{
    public System.Drawing.Font font = new Font("Arial", 10.0f);

    public void Dispose()
    {
        font.Dispose()
    }
}

(私はdisposeパターンを正しく実行しなかったことを知っていますが、サンプルコードについては十分に良いはずです)

フィールドが静的フィールドである場合、フィールドのDisposeの呼び出しはどこにあるべきですか?

public class B
{
    public static System.Drawing.Font font = new Font("Arial", 10.0f);
}

クラスBにIDisposableを実装させてその呼び出しを行うこともできますfont.Disposeが、後でB.fontを再度使用すると、問題が発生します。また、静的メソッドにアクセスする場合は、Disposeを呼び出すためだけにインスタンスを作成する必要があることを覚えておく必要があります。

静的なDisposeメソッドを作成することもできますが、その場合、ユーザーはDisposeを呼び出すことを忘れずに、プログラム内で最後のユーザーであることを確認する必要があります。

4

4 に答える 4

11

静的フィールドは、タイプがロードされるときに初期化されます。

したがって、論理的には、包含タイプがアンロードされるときに静的フィールドに割り当てられたオブジェクトを破棄することは理にかなっています。

ただし、タイプはアンロードされません。AppDomainsの周りにいくつかのエキゾチックな問題があるかもしれませんが、あなたの場合には当てはまらないと思います。

したがって、インスタンスを破棄しません。そうしないと、使用に適さないオブジェクトの公開されているインスタンスが作成されます。

于 2012-12-25T18:51:32.633 に答える
3

フィールドが静的である場合、おそらくその意図は、アプリケーションの全期間にわたってフィールドを持続させることですか?その場合、アプリケーションがシャットダウンしたときにのみ廃棄する必要があるためです。そして、それはそれ自体で、いずれかの方法で起こります-

アプリケーションの存続期間中に静的フィールドを別のIDisposableオブジェクトに数回再割り当てする場合は、もちろん、再割り当てするときに古いオブジェクトを破棄する必要があります。多分あなたはそのためのプロパティを使用することができますか?私はそれについて多くのことを考えたわけではありませんが、次のようなものです。

// private - don't write to this field from outside the property setter
static Font font = new Font("Arial", 10.0f));

public static Font Font
{
  get
  {
    return font;
  }
  set
  {
    var oldFont = font;
    if (oldFont != null)
      oldFont.Dispose();
    font = value;
  }
}
于 2012-12-25T18:51:34.663 に答える
2

他のオブジェクトと同じように廃棄します。違いはありません。静的オブジェクトは、クラスごとに使用できる単なるオブジェクトです。それはまだ何かのインスタンスです。確かに、これを破棄した後でも誰かがアクセスしてObjectDisposedException例外を取得する可能性があるため、おそらくこれを実行したくないでしょう。

    static void Main(string[] args)
    {
        using (Test.Instance)
        {

        }  

        Thread.Sleep(TimeSpan.FromSeconds(10));
    }

    public class Test:IDisposable
    {
        public static Test Instance = new Test();
        public void Dispose()
        {
            Console.WriteLine("Disposed");
        }
    }

そして、出力は次のとおりです。

処分

更新された例によると:

public class A
{
    public static System.Drawing.Font font = new Font("Arial", 10.0f));
}

あなたはただすることができますA.font.Dispose()またはusing(A.font)

一般に、静的にすることで、アプリケーションの存続期間中は存在する必要があることを意味するため、パブリック静的使い捨てフィールドは実際には存在しないという考えだと思います。使い捨てにする必要がある場合は、レイジーにしてスレッドセーフに再初期化できるようにする必要があります。そうしないと、破棄後にアクセスすると例外がスローされます。または、アプリケーションの終了コードにフックして、すべての静的ディスポーザブルを安全に廃棄することもできます。使い捨てはどこかで開始時に登録することもできます。ただのアイデア

于 2012-12-25T18:17:15.353 に答える
-2

静的クラスのインスタンスがないため、静的クラスを破棄することはできません

于 2012-12-25T18:28:15.290 に答える