我正在关注微软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(....);
答案 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
实现了IDisposable
。 using
块提供了一种简单,干净的方法,以确保 - 即使在异常的情况下 - 您的资源也得到了适当的清理。有关using
块的详细信息(具体而言,IDisposable
接口是什么),请参阅meta description on the IDisposable
tag。
答案 2 :(得分:2)
改变这个:
using (StreamReader sr = new StreamReader("TestFile.txt"));
到此:
using (StreamReader sr = new StreamReader("TestFile.txt"))