2

重複の可能性:
C# Using ブロックとは何ですか? なぜそれを使用する必要があるのですか?

それで、msdn の例といくつかのスタックオーバーフローの質問で、ストリームライターなどの前に using ステートメントが使用されている場所に回答があることに気付きましたが、実際にはどのような利点がありますか? 私はそれを使用する理由を教えられたり、言われたり、読んだりしたことがないので。

            using (StreamReader sr = new StreamReader(path)) 
            {
                while (sr.Peek() >= 0) 
                    Console.WriteLine(sr.ReadLine());
            }

それ以外の:

            StreamReader sr = new StreamReader(path);
            while (sr.Peek() >= 0) 
                Console.WriteLine(sr.ReadLine());
4

4 に答える 4

6

using ブロックは、Dispose使用するオブジェクトのメソッドを自動的に呼び出しますが、呼び出されることが保証されているのが良い点です。したがって、ステートメントのブロックで例外がスローされるかどうかに関係なく、オブジェクトは破棄されます。次のようにコンパイルされます。

{
    StreamReader sr = new StreamReader(path);
    try
    {
        while (sr.Peek() >= 0) 
            Console.WriteLine(sr.ReadLine());
    }
    finally
    {
        if(sr != null)
            sr.Dispose();
    }
}

追加の中括弧は、のスコープを制限するsrために配置されているため、using ブロックの外部からはアクセスできません。

于 2013-01-31T23:36:33.477 に答える
2

using は、IDisposable オブジェクトを正しく使用するための便利な構文を提供します。次のようにコンパイルされます。

StreamReader sr = new StreamReader(path);
try 
{
    while (sr.Peek() >= 0) 
        Console.WriteLine(sr.ReadLine());
} finally
{
    sr.Dispose();
}

MSDN で文書化されているように

于 2013-01-31T23:42:10.940 に答える
1

using ステートメントは、IDisposable インターフェイスを実装するもので機能します。

.net は、StreamReader が破棄されることを保証します。

それを閉じたり、さらに管理したりすることを心配する必要はありません。「using」スコープ内で必要なものを使用するだけです。

于 2013-01-31T23:38:29.877 に答える
1

メソッドが自動的に呼び出さStreamReader.Dispose()れます。キーワードを使用しないことを選択した場合using、コード ブロックの実行後にストリームが開いてしまいます。これは、継続して使用するためにファイル (など) を予約したい場合に便利ですが、終了時に手動で破棄する予定がない場合は悪い習慣になる可能性があります。

于 2013-01-31T23:40:38.370 に答える