Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 名称';sr';不';不存在于当前环境中_C#_Compiler Errors_Try Catch_Scope - Fatal编程技术网

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
时,流将被关闭。并且
使用
正确关闭流(即使在异常情况下)。