C# 名称';sr';不';不存在于当前环境中
我是按照微软的例子来阅读文本文件的。他们说这样做:C# 名称';sr';不';不存在于当前环境中,c#,compiler-errors,try-catch,scope,C#,Compiler Errors,Try Catch,Scope,我是按照微软的例子来阅读文本文件的。他们说这样做: class Test { public static void Main() { try { using (StreamReader sr = new StreamReader("TestFile.txt")); { String line = sr.ReadToEnd(); Conso
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中这样做时,它会给我带来错误:
可能错误的空语句
using (StreamReader sr = new StreamReader("TestFile.txt"));
{
String line = sr.ReadToEnd();
Console.WriteLine(line);
}
名称“sr”在当前上下文中不存在
我使用部分删除了部分,现在代码看起来像这样,并且正在工作:
try
{
StreamReader sr = new StreamReader("TestFile.txt");
string line = sr.ReadToEnd();
Console.WriteLine(line);
}
为什么呢
更新:在使用(..)的结尾处有分号代码>您所描述的是通过放置来实现的代码>使用语句后
using (StreamReader sr = new StreamReader("TestFile.txt"));
{
String line = sr.ReadToEnd();
Console.WriteLine(line);
}
可能你甚至没有注意到这一点,后来就删除了
使用(StreamReader)和仅使用StreamReader有什么区别
当您在using语句中放入一次性变量(StreamReader)时,它与:
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
,则稍后将可见,但流将关闭。更改此选项:
using (StreamReader sr = new StreamReader("TestFile.txt"));
为此:
using (StreamReader sr = new StreamReader("TestFile.txt"))
我之所以添加这个答案,是因为现有的答案(虽然正确地向上投票)只是告诉您错误是什么,而不是为什么它是错误
这样做
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
语句,因为StreamReader
实现了IDisposable
。using
块提供了一种简单、干净的方法来确保(即使在出现异常的情况下)正确地清理资源。有关使用
块的更多信息(特别是IDisposable
界面的内容),请参阅。如果您的代码使用良好,请参阅。也许你把代码>使用语句后;代码看起来正确。在Try/Catch之后是否有更多使用sr变量的代码?。如果在外部使用sr,则未定义变量。PD:好吧,我从另一个角度理解它,我认为第一个代码段是有效的,而不是第二个。Sorry检查using语句末尾的分号原因是分号,小窗口使用(StreamReader…{}和仅使用StreamReader…{}有什么区别?使用(StreamReader…{}和仅使用StreamReader…{}有什么区别?使用(StreamReader sr...{}在右大括号之后立即清除“sr”对象。在另一种方法中,您应该确保在不再使用对象时正确地处置该对象。using
语句会自动对该语句中声明的一次性对象调用dispose
方法。当您在using语句中声明StreamReader
时,流将被关闭。并且使用
正确关闭流(即使在异常情况下)。