
以下のような処理を行った場合の「CA2202: オブジェクトを複数回破棄しません」の回避方法についてご教示ください。
using(var fs = new FileStream(path,FileMode.Open,FileAccess.Read,FileShare.ReadWrite))
using(var sr=new StreamReader(fs)) {
--読み込み処理--
}
上記の処理を記載した場合StreamReaderの生成に成功した場合、
usingステートメントの完了時にStreamReader生成時にfsとして与えられたFileStreamのDisposeメソッドがStreamReader内部で実行した後に、
fs変数としてもDisposeメソッドを二重呼び出してしまいます。
多くの.NETライブラリのDisposeメソッドでは二重呼び出ししても二重開放が起こらないように対策はされていますが全く問題ないというわけでもありません。
そこで二重開放をしない方法を考えると以下のようなものは思いつきました。
var fs = new FileStream(path,FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
StreamReader sr=null;
try {
sr = new StreamReader(fs);
} catch(Exception) {
fs?.Dispose();
throw;
}
try {
--読み込み処理--
} finally {
sr?.Dispose();
}
ただ、本来はusingステートメント完了時にリソース開放をする目的で設計されているDisposeメソッドを全く無関係に呼び出している事等からもうちょっとどうにかならないかなと思っている次第です。
よい方法がございましたらご教示よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
本家に解決例が載ってますよ。
> 本来はusingステートメント完了時にリソース開放をする目的で設計されているDisposeメソッド
逆です。
リソースを解放する目的で用意されているDisposeを、元々は明示的に呼び出していたのが、
新しいC#/VB.Netで using文が導入されて、明示的に書かなくても済むようになりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- 英語 下記の英文を日本語に訳してください。 1 2023/03/10 13:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
処理内容がほぼ同じメソッドの...
-
VBPをダブルクリックするとたま...
-
【sendkeysメソッドが動かずに...
-
Labelコントロールに数字を代入...
-
CALLされていないメソッドを見...
-
javascriptからjavaを呼び出したい
-
final修飾子を使っているのに、...
-
配列のメソッド
-
mainメソッドのthrows節で設定...
-
VBA コピーが出来ません…!
-
VB.netで、シリアル通信のタイ...
-
エクセルVBAにおけるON TIMEメ...
-
0歳児の指しゃぶりに関して
-
VBAでSaveAs使用し、指定してい...
-
JAVA言語,JSPによるクイズシス...
-
DataGridViewでセルクリックイ...
-
Excel VBA でExcelを終了したい...
-
C#.net Define文
-
コマンドプロンプト実行後に画...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
DataGridViewでセルクリックイ...
-
【sendkeysメソッドが動かずに...
-
コマンドプロンプト実行後に画...
-
VBA コピーが出来ません…!
-
ウィンドウを最前面にできません
-
JSPで<SELECT>の中にDBから持っ...
-
javascriptからjavaを呼び出したい
-
VBPをダブルクリックするとたま...
-
eclipse-Tomcatでのデバッグに...
-
Application.Wait の参照設定
-
エクセルVBAにおけるON TIMEメ...
-
配列のメソッド
-
エクセルのマクロでプリンタを...
-
final修飾子を使っているのに、...
-
drawStringで文字間隔の調整
-
Excel VBA でExcelを終了したい...
-
worksheets & rows メソッドは...
-
CALLされていないメソッドを見...
-
vbaエクセルマクロ RemoveDupli...
おすすめ情報