2

私はテキストファイルから読むためにマイクロソフトサイトからの例に従っていました。彼らはこのようにそれをするように言います:

class Test
{
    public static void Main()
    {
        try
        {
            using (StreamReader sr = new StreamReader("TestFile.txt"));
            {
                String line = sr.ReadToEnd();
                Console.WriteLine(line);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("The file could not be read:");
            Console.WriteLine(e.Message);
        }
    }
}

しかし、Visual C#2010でそのようにすると、エラーが発生します。

誤った空のステートメントの可能性

「sr」という名前は現在のコンテキストには存在しません

パーツを削除するusingと、コードは次のようになり、機能しています。

try
{
    StreamReader sr = new StreamReader("TestFile.txt");
    string line = sr.ReadToEnd();
    Console.WriteLine(line);
}

何故ですか?

更新:最後にセミコロンがありましたusing(....);

4

3 に答える 3

14

あなたが説明したことは;、ステートメントを使用した後に置くことによって達成されます

using (StreamReader sr = new StreamReader("TestFile.txt"));
{
     String line = sr.ReadToEnd();
     Console.WriteLine(line);
}

おそらくあなたはそれに気づかず、後で削除したのかもしれません。

using(StreamReader)と単にStreamReaderの違いは何ですか?

使い捨て変数(StreamReader)をusingステートメントに入れると、次のようになります。

StreamReader sr = new StreamReader("TestFile.txt");
try
{
    String line = sr.ReadToEnd();
    Console.WriteLine(line);
}
finally
{
    // this block will be called even if exception occurs
    if (sr != null)
        sr.Dispose(); // same as sr.Close();
}

また、usingブロックで変数を宣言すると、usingブロックでのみ表示されます。;そのため、後者のコンテキストではStreamReaderが存在しなくなりました。ブロックを使用する前に宣言するsrと、後で表示されますが、ストリームは閉じられます。

于 2012-11-13T22:03:35.330 に答える
7

この回答を追加しているのは、既存のもの (適切に支持されている間) がエラーの理由ではなく、エラーの内容を伝えるだけだからです。

これを行う;

using (StreamReader sr = new StreamReader("TestFile.txt"));
{
     String line = sr.ReadToEnd();
     Console.WriteLine(line);
}

実際には、これを行うのと (意味的に) 同じです:

using (StreamReader sr = new StreamReader("TestFile.txt"))
{
    // Note that we're not doing anything in here
}
{
     String line = sr.ReadToEnd();
     Console.WriteLine(line);
}

2 番目のブロック (中かっこの 2 番目のセットによって作成される) は、usingブロックとは何の関係もありません。ブロック内で定義された変数usingはそのブロック内のスコープ内にのみあるため、コードが 2 番目のブロックに到達すると (スコープ内にあり、アクセス可能であるという点で) 存在しません。

を実装してusingいるため、ステートメントを使用する必要があります。このブロックは、例外が発生した場合でも、リソースが適切にクリーンアップされるようにするためのシンプルでクリーンな方法を提供します。ブロックの詳細(および具体的にはインターフェースとは何か) については、タグのメタ記述を参照してください。StreamReaderIDisposableusingusingIDisposableIDisposable

于 2012-11-13T22:11:41.167 に答える
2

これを変える:

  using (StreamReader sr = new StreamReader("TestFile.txt"));

これに:

  using (StreamReader sr = new StreamReader("TestFile.txt"))
于 2012-11-13T22:07:22.840 に答える