2

XML を使用してクラス オブジェクトをシリアル化および逆シリアル化する作業を行っていたときに、分離ストレージ領域を使用して Windows Phone 7 でそれを行う方法を示すこのブログ投稿に出会いました。Windows Phone 7 は、私が開発しているプラ​​ットフォームです。

このでは、明示的にDispose()を呼び出すオブジェクトは TextReader オブジェクトだけです。MSDN で TextReader オブジェクトを調べたところ、ドキュメントに次のように記載されていることがわかりました。

TextReader によって使用されるアンマネージド リソースを解放し、オプションでマネージド リソースを解放します。

したがって、彼がこれを行う理由は、TextReader オブジェクトによって取得された管理されていないリソースをすぐに解放するためだと思います。彼のブログ投稿がなければ、私はこれをやろうとは思わなかったでしょう。明らかに、目に見えるすべてのオブジェクトで Dispose() の呼び出しを開始したくないので、特定のオブジェクトで Dispose() を呼び出す必要があるかどうかを少なくとも調査するための良い経験則は何ですか? 少なくとも、この特別な処理を必要とする一般的な .NET オブジェクトについて、これに関するガイドラインやリストはどこかにありますか?

4

4 に答える 4

5

明らかに、すべてのオブジェクトで Dispose() の呼び出しを開始したくありません

違う。

一般に、実装するすべてのオブジェクトは、通常はステートメントIDisposableを使用して、使い終わったらすぐに破棄する必要があります。using

アンマネージ リソースを持たないほとんどのオブジェクトは実装されていないIDisposable(そしてDispose()メソッドを持たない) ため、心配する必要はありません。

唯一の例外はIDisposable、一部の派生実装に破棄するものがある場合に実装する基底クラスです (例: 、IEnumeratorComponentまたはTextReader)。
ただし、どの具体的な実装を破棄する必要があるかは常に明らかであるとは限りません (いつでも変更される可能性があります)。

于 2013-04-04T03:14:01.770 に答える
3

明らかに、目に見えるすべてのオブジェクトで Dispose() の呼び出しを開始したくないので、特定のオブジェクトで Dispose() を呼び出す必要があるかどうかを少なくとも調査するための良い経験則は何ですか?

これは問題ではありません。コンパイラは、それを実装していないオブジェクトで Dispose() を呼び出すことを許可しません。

そして、それを実装するすべてのオブジェクトに対して Dispose() を呼び出す必要があります(インターフェイスを介して行いIDisposableます)。それがあなたが従うべきガイドラインです。実際、オブジェクトが を実装するとは、解放する必要のある管理されていないリソースがあることを意味します。IDisposable

usingオブジェクトの作成と使用をステートメントでラップするだけであれば、面倒な作業ははるかに少なくなります。たとえば、次のようになります。

using (DisposableObject obj = new DisposableObject(...))
{
    obj.DoWork();
} // obj.Dispose() is automatically called here, even if an exception is thrown
于 2013-04-04T03:15:31.470 に答える
2

実際には、IDisposable を実装するオブジェクトを破棄する必要があります。

Dispose() を直接呼び出すのではなく、これを行う標準的な方法は次のとおりです。

using(AnyIDisposable obj = ...)
{
    // work with obj here
}
//The Dispose() method is already called here
于 2013-04-04T03:15:29.470 に答える