アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のような処理を行った場合の「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メソッドを全く無関係に呼び出している事等からもうちょっとどうにかならないかなと思っている次第です。
よい方法がございましたらご教示よろしくお願いいたします。

A 回答 (1件)

https://msdn.microsoft.com/ja-jp/library/ms18233 …

本家に解決例が載ってますよ。

> 本来はusingステートメント完了時にリソース開放をする目的で設計されているDisposeメソッド

逆です。
リソースを解放する目的で用意されているDisposeを、元々は明示的に呼び出していたのが、
新しいC#/VB.Netで using文が導入されて、明示的に書かなくても済むようになりました。
    • good
    • 0
この回答へのお礼

ありがとうございます。
同一のページを見ていながら見落としていたようでお恥ずかしい限りです。

お礼日時:2017/02/16 22:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!