繁体   English   中英

在当前上下文中不存在名称'sr'

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM