该名“SR”在目前的情况下不存在(The name 'sr' doesn't

2019-08-02 17:42发布

我在下面的例子中,从微软的网站从文本文件阅读。 他们说,这样做是这样的:

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(....);

Answer 1:

我只加入这个答案,因为现有的(同时适当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标签 。



Answer 2:

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

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使用块之前,这将是可见以后,但流将被关闭。



Answer 3:

更改此设置:

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

为此:

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


文章来源: The name 'sr' doesn't exist in current context