質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

3回答

4992閲覧

C#でのusingステートメント内での配列定義について

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

2クリップ

投稿2017/08/09 13:41

いつもお世話になります。
主題の通り、C#で以下のようなことをやりたいのですが、配列はIDisposableではないため、コンパイルエラーになってしまいます。

C#

1using(IDisposable [] disposables = new MyDisposableClass [100]) 2{ 3 ~~~ 4}

usingステートメント内で配列を定義する方法について調べてみたりしたのですが、目当ての記述は見つけることができませんでした。
そもそも、usingステートメント内で配列を生成したいという考え方がおかしいのでは・・・と思ってきましたが(というか、検索しても見つからないということは、おかしいのだと薄々勘付いてはいます・・・)、IDisposableオブジェクトの配列を生成することは需要があるのではないかなとも思います。

要点としては、以下の通りです。

  • C#のusingステートメント内でIDisposableオブジェクトの配列を定義する方法はないでしょうか
  • ないとしても、それに準ずる良い方法は何かないでしょうか
  • そもそも、考え方がおかしいでしょうか(その場合はその理由も教えていただけると幸いです)

以上、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

「IDisposableなオブジェクトのコレクションであり、自身もIDisposableを実装している」
というクラスを作って、それを利用してはどうでしょうか。

csharp

1public class DisposableList : List<IDisposable>, IDisposable 2{ 3 // Dispose() や Dispose(bool) あたりを適宜実装 4} 5 6public class SomeClass 7{ 8 void SomeMethod() 9 { 10 using (var disposableList = new DisposableList(...)) 11 { 12 // 何らかの処理 13 } 14 } 15}

投稿2017/08/09 14:36

編集2017/08/09 14:50
alg

総合スコア2019

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

using の使い方を間違っておられるかどうかは分かりませんが、説明だけ。

using () {} は、あるオブジェクトに紐づく資源の解放手順に関して、そのオブジェクト自らが手順を公開しているという意味のインタフェース IDisposable を定義する事で、using 区を抜けた後に自動でその資源が解放される(Dispose()が呼び出される)という機構です。資源とは例えばファイルをオープンした際のハンドルなどが当たります。

資源が解放されるのは「配列の中身」であって、「配列自身」ではありません。もし配列を疑似的に IDisposable にして解放時に配列の中身も同時に解放したいというニーズであれば alg さんの提案するクラスを作成するのが良いかと思います。その場合、Dispose を実装しループで .Dispose() を呼び出す必要があります。

ここまで理解頂いた上で再度このコードを見て頂くと

using(IDisposable [] disposables = new MyDisposableClass [100]) { ~~~ }

この disposables の生存範囲は using の中だけであり、つまりその為に配列を作って詰め込んで消えていくという、あまり意味の無さそうな物に見えてくるかと思います。単に 100 個の IDisposable なオブジェクトを引き回したいのであれば using は使わないでしょうし、解放したいならば

foreach (var d in disposables) { d.Dispose() }

とだけ書けば良いのが分かって頂けるかと思います。

投稿2017/08/09 16:26

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ど素人の個人的な意見ですが

usingステートメントはC#において、別のクラスを読み込むという機能だと思うんですが・・・配列をusing内で書くというのは用途としておかしい気がします。C#でそういう想定はされてないような。

Using ステートメントの使用例:[ VB.NET / C# ] Try ~ Finally と Using による確実な終了処理

C#

1using (StreamWriter sw = new StreamWriter(@"E:\B.txt", false)){ }

試してみましたが

C#

1using (List<IDisposable>.Enumerator textLine = new List<IDisposable>.Enumerator()) 2 { }

こんな感じで書けるようです。
Visuau Studio 2017でコンパイル通りましたね。どう実装すべきなのかわかりませんが。。。

投稿2017/08/09 14:58

sheephuman

総合スコア112

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問