为什么在C#中我们要在StreamReader之前使用using?

7
为什么在中我们要在streamreader前面加上using?
using (StreamReader sr = new StreamReader("TestFile.txt")) 
{
    string line;
    // Read and display lines from the file until the end of 
    // the file is reached.
    while ((line = sr.ReadLine()) != null) 
    {
        Console.WriteLine(line);
    }
}

5
把光标放在关键词上,按下 F1 键就能告诉你所需知道的信息。 - slugster
8个回答

11

C#中的using块在处理可释放对象时非常方便。 可释放对象是那些在调用dispose时可以显式释放它们所使用的资源的对象。 我们知道,.Net垃圾收集是不确定的,因此您无法预测对象何时被垃圾收集。

阅读本文以获取更多详细信息:了解C#中的'using'块


2
与其引用一篇博客文章(甚至复制粘贴),然后只是指向该文章,您应该进一步阐述并谈论为什么释放资源很重要;即 usingIDispose 在释放非托管资源方面所起的作用。 - slugster

6
使用using语法是一个好习惯,特别是当您使用实现了IDisposable接口的对象(StreamReader就是这样的对象)时,因为它确保Dispose方法总是被调用并且对象被正确处理。
例如,在这种情况下,将获取有关文件"TestFile.txt"的各种句柄/锁定,这可能会阻止其他人写入或读取该文件,直到流读取器被处理或进程结束。其他对象(如数据库对象)可能会使用数据库连接或网络资源,因此您应该在完成使用后立即处理对象 - 使用语句只是一种简单而安全的模式。
在底层,正在发生类似于此的事情(参考文献):
StreamReader sr = new StreamReader("TestFile.txt");
try
{
    string line;
    // Read and display lines from the file until the end of 
    // the file is reached.
    while ((line = sr.ReadLine()) != null) 
    {
        Console.WriteLine(line);
    }
}
finally
{
    if (sr != null)
    {
        ((IDisposable)sr).Dispose();
    }
}

然而,使用using语句比手动处理IDisposable对象更加简洁(且不易出错)。


6

这样当你使用完StreamReader后,它会被正确地处理。此外,在出现异常的情况下,using语句在异常传播之前调用Dispose


3

代码由编译器转换为:

StreamReader sr = new StreamReader("TestFile.txt")
try
{
    string line;
    // Read and display lines from the file until the end of 
    // the file is reached.
    while ((line = sr.ReadLine()) != null) 
    {
        Console.WriteLine(line);
    }
}
finally
{
    sr.Dispose();
}

这确保了无论发生什么,sr 都会被正确处理(清理)。每当创建一个实现 IDisposable 接口的对象时,最好将其包装在 using 结构中,以确保尽快清理并释放任何昂贵或稀缺的资源。


3

如果不使用using,当文件使用完毕后将无法关闭。


3
有时候,在我们使用完对象之后,进行Dispose是非常重要的。
将对象的构建放在一个using块中意味着一旦花括号内的代码完成,处理它的销毁就会自动完成。
在读取文本文件的StreamReader的情况下,这一点尤其重要,因为在StreamReader读取文件的时候,该文件由系统锁定。释放锁允许其他进程修改或删除文件。

3

using语句保证了Dispose()方法的调用,并且Dispose()会调用stream.Close()


2
你不需要使用using,但这是确保对象被正确处理的方便方法。只要你确信在最后处置该对象(使用finally是正常方式),就可以不使用using。如果有特定原因想要持续使用该对象,则可以这样做。
然而,如果你尝试这样做,代码结构可能存在问题。将StreamReader(和其他iDisposible对象)的使用包含在using语句中有助于良好地组织你的代码。

如果您想要控制文件何时关闭,您确实需要使用 using(或显式调用 Dispose)。 - David Heffernan
是的,绝对没错。在编译方面你不必这样做,但为了避免文件系统出现重大问题,你必须这样做。 - Schroedingers Cat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接