• ベストアンサー

C# で using

C# で、IDisposable インタフェースを実装したクラスを利用するとき、 SomeClass a = new SomeClass(); (処理) a.Dispose(); のかわりに、 using (SomeClass a = new SomeClass()) {   (処理) } と書くのだと理解しているのですが、例えば SomeClass a = new SomeClass(); SomeClass b = a.SomeMethod(); a.Dispose(); (処理) b.Dispose(); のようなコードを using を用いて書き直すとどのようになるのでしょうか? a, b が、完全なネストになっていないので、こういう場合は無理でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • JeanneNet
  • ベストアンサー率48% (100/208)
回答No.2

こんにちは、じゃんぬねっと です。 Java の try ~ finally と同じ理論でしょう。 つまり、入れ子に書くべきです。 なるべくすぐ破棄すべきなのですが、大切なのは保証されることです。

migoreng
質問者

お礼

そういうポリシーがあるのですね。 回答、ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

その例の順序をそのまま書き直すのは無理そうですね。 もし「(処理)」の内容が、「(処理)」の前でなく後でa.Dispose();しても問題ないようなものであれば、「(処理)」の場所を移動すればよさそうですが・・・どうしても先にaをdisposeしないとダメな場合ですと、ダメですね。 でも、そんな場合ってあるんでしょうか。

migoreng
質問者

お礼

早速のご回答ありがとうございます。 例えば、 SomeClass a = new SomeClass(); SomeClass b = a.SomeMethod(); a.Dispose(); (処理) SomeClass c = b.SomeMethod(); b.Dispose(); (処理) c.Dispose(); のような状況を考えると、この例では最大でも 2 つのクラス分のメモリしか使用していませんが、 using (SomeClass a = new SomeClass()) {   using (SomeClass b = a.SomeMethod())   {     (処理)     using (SomeClass c = b.SomeMethod())     {       (処理)     }   } } のように書いてしまうと、最大で 3 つのクラス分のメモリを使用することになり、コーディングの都合でリソース解放タイミングが遅れてしまうという状況が発生し、using の趣旨に反することになると思うのです。 よろしくお願いいたします。

migoreng
質問者

補足

すみません。さらに補足いたしますと、 using (SomeClass a = new SomeClass()) {   SomeClass b = a.SomeMethod(); } (bを利用した処理) using (SomeClass c = b.SomeMethod()) {   b.Dispose();   (cを利用した処理) } と書くことは可能だと思います。でも、あまり綺麗ではないですよね。

すると、全ての回答が全文表示されます。

関連するQ&A