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 语句之后放置来实现的

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);
}

using第二个块(由第二组花括号创建)与该块没有任何关系。由于在块内定义的变量using仅在该块内的范围内,因此一旦您的代码到达第二个块,它就不存在(就在范围内和可访问而言)。

You should use the using statement because StreamReader implements IDisposable. The using block provides a simple, clean way to ensure that--even in the case of an exception--your resources are properly cleaned up. For more information on the using block (and, specifically, what the IDisposable interface is), see the meta description on the IDisposable tag.

于 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 回答