[英]The name 'sr' doesn't exist in current context
我正在关注微软网站上的示例,以便从文本文件中读取。 他们说是这样做的:
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);
}
可能你甚至没有注意到并在以后删除。
使用(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"));
{
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
实现了IDisposable
。 using
块提供了一种简单,干净的方式,以确保 - 即使在例外情况下 - 您的资源也得到了适当的清理。 有关using
块的更多信息(具体而言, IDisposable
接口是什么),请参阅IDisposable
标记上的元描述 。
改变这个:
using (StreamReader sr = new StreamReader("TestFile.txt"));
对此:
using (StreamReader sr = new StreamReader("TestFile.txt"))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.