在当前上下文中不存在名称’sr’

我是从微软网站关注的例子,用于从文本文件中读取。 他们说是这样做的:

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(....);结束时有分号using(....);

我只是添加了这个答案,因为现有的答案(虽然正确投票)只是告诉你错误是什么,而不是为什么它是一个错误。

这样做;

 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块提供了一种简单,干净的方式,以确保 – 即使在exception情况下 – 您的资源也得到了适当的清理。 有关using块的更多信息(具体而言, IDisposable接口是什么),请参阅IDisposable标记上的元描述 。

你所描述的是通过推杆实现的; 使用声明后

 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 ,它将在稍后显示,但将关闭流。

改变这个:

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

对此:

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