我在下面的例子中,从微软的网站从文本文件阅读。 他们说,这样做是这样的:
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(....);
我只加入这个答案,因为现有的(同时适当upvoted)只是告诉你是什么错误,不为什么这是一个错误。
这样做;
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"));
{
String line = sr.ReadToEnd();
Console.WriteLine(line);
}
也许你甚至没有注意到,后来被删除。
什么是使用(StreamReader的),只是StreamReader的区别?
当您使用的语句把一次性变量(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();
}
此外,如果你使用块声明变量,它只会在使用块可见。 这就是为什么;
使你的StreamReader不存在在后一种情况下。 如果你声明sr
使用块之前,这将是可见以后,但流将被关闭。
更改此设置:
using (StreamReader sr = new StreamReader("TestFile.txt"));
为此:
using (StreamReader sr = new StreamReader("TestFile.txt"))