C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: usingステートメントを途中で抜けたとき


(過去ログ 10 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■1826 / inTopicNo.1)  usingステートメントを途中で抜けたとき
  
□投稿者/ のぶお (1回)-(2007/03/07(Wed) 10:54:51)

分類:[C# (Windows)] 

はじめまして。
プログラミングしていて分からないことがあったので質問させてください。

usingステートメント内で、returnやbreak, continueなどを使って途中で抜けた場合、
オブジェクトはちゃんと破棄されるのでしょうか?
ちなみに.NET Framework2.0でC#を使っています。

たとえば下の例で、return trueで抜けた場合、StreamReaderはCloseされますか?
try 〜 finally 〜 と完全に等価であればされると思いますが、
明確な記述が見つからなかったので質問してみました。
よろしくお願いします。

例)1行目に指定された記述があるファイルが存在するかどうか調べるメソッド

public static bool Exists(string str)
{
    string[] files = Directory.GetFiles("C:\\test");

    for (int i = 0; i < files.Length; i++)
    {
        using (StreamReader sr = new StreamReader(files[i]))
        {
            if (str == sr.ReadLine())
                return true;
        }
    }

    return false;
}

引用返信 編集キー/
■1827 / inTopicNo.2)  Re[1]: usingステートメントを途中で抜けたとき
□投稿者/ επιστημη (427回)-(2007/03/07(Wed) 11:07:12)
επιστημη さんの Web サイト
> try 〜 finally 〜 と完全に等価であればされると思いますが、
> 明確な記述が見つからなかったので質問してみました。

MSDNには:「スコープの外部ではオブジェクトが破棄されます」とあります。
ってことは如何なる理由であれ、スコープから抜け出せばDisposeされるっしょ。

疑わしいなら

class Foo : IDisposable {
  void Dispose() { Console.WriteLine("あなた、アタシを捨てるのね!?"); }
}

なんてお試しクラスこさえて確認してはいかがでしょ。

引用返信 編集キー/
■1831 / inTopicNo.3)  Re[1]: usingステートメントを途中で抜けたとき
□投稿者/ よねKEN (11回)-(2007/03/07(Wed) 11:34:16)
よねKEN さんの Web サイト
> usingステートメント内で、returnやbreak, continueなどを使って途中で抜けた場合、
> オブジェクトはちゃんと破棄されるのでしょうか?

ildasmというツールはご存知でしょうか?
テストプログラムを作り、ildasmで逆アセンブルしてみるとわかりますが、
usingはtry〜finallyと等価です。

ILアセンブラ上ではtry〜finallyは以下のような記述になります。
.try
{

}
finally
{

}

引用返信 編集キー/
■1950 / inTopicNo.4)  Re[2]: usingステートメントを途中で抜けたとき
□投稿者/ のぶお (3回)-(2007/03/09(Fri) 20:09:31)
お試しクラスですか、なるほど。
作ってみると確認できますね。

ildasmというのがあるのですね。
今ちょっと調べてみました。
今回だけでなく、今後も使えそうです。
どうもありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -