名字' sr'在当前的背景下不存在

时间:2012-11-13 21:58:38

标签: c# compiler-errors try-catch scope

我正在关注微软site的示例,以便从文本文件中读取。他们说是这样做的:

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(....);

末尾有分号

3 个答案:

答案 0 :(得分:14)

您所描述的是通过在使用声明

后放置;来实现的
using (StreamReader sr = new StreamReader("TestFile.txt"));
{
     String line = sr.ReadToEnd();
     Console.WriteLine(line);
}

可能你甚至没有注意到这一点并在以后删除。

使用(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();
}

此外,如果您在使用块中声明变量,它将仅在使用块中可见。这就是为什么;使您的StreamReader在后一种情况下不存在的原因。如果您在使用块之前声明sr,它将在稍后显示,但将关闭流。

答案 1 :(得分: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块中定义的变量仅在该块的范围内,因此一旦您的代码到达第二个块,它就不存在(就在范围和可访问性方面)。

您应该使用using语句,因为StreamReader实现了IDisposableusing块提供了一种简单,干净的方法,以确保 - 即使在异常的情况下 - 您的资源也得到了适当的清理。有关using块的详细信息(具体而言,IDisposable接口是什么),请参阅meta description on the IDisposable tag

答案 2 :(得分:2)

改变这个:

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

到此:

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