c# - File.ReadLines 什么时候释放资源

标签 c# .net-4.0

在 C# 中处理文件时,我习惯于考虑释放相关资源。通常这是一个 using 语句,除非它是一个单行方便的方法 例如 File.ReadAllLines,它将为我打开和关闭文件。

.Net 4.0 引入了便捷方法File.ReadLines。这将返回一个 IEnumerable 并被称为处理文件的更有效方式 - 它避免将整个文件存储在内存中。为此,我假设枚举器中有一些延迟执行逻辑。

显然,由于此方法返回的是 IEnumerable 而不是 IDisposable,因此我不能按照我对 using 语句的直觉 react 去做。

我的问题是: 考虑到这一点,使用此方法在资源释放方面是否存在任何问题?

调用此方法是否意味着关联文件锁的释放是不确定的?

最佳答案

IEnumerable不从 IDisposable 继承,因为通常情况下,实现它的类只给您 promise 可枚举,它实际上还没有做任何值得处置的事情。

但是,当您对其进行枚举时,您首先会检索到一个 IEnumerator通过调用 IEnumerable.GetEnumerator方法,通常,您返回的底层对象确实实现了IDisposable .

方式foreach实现与此类似:

var enumerator = enumerable.GetEnumerator();
try
{
    // enumerate
}
finally
{
    IDisposable disposable = enumerator as IDisposable;
    if (disposable != null)
        disposable.Dispose();
}

这样,如果对象确实实现了 IDisposable , 它将被处理掉。对于 File.ReadLines , 直到你开始枚举它,文件才真正打开,所以你从 File.ReadLines 得到的对象不需要处置,但您获得的枚举器需要处置。

如评论所示,IEnumerator不继承自 IDisposable ,即使许多典型的实现都这样做,而通用的 IEnumerator<T>继承 IDisposable .

关于c# - File.ReadLines 什么时候释放资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3379267/

相关文章:

c# - C#中的遍历路径

c# - 如何在C#中动态添加数组的索引值?

c# - 异步 Web 请求超时 => 使 IIS 崩溃

asp.net - .Net Framework 2.0 的 https 请求失败但适用于 .Net 4.0

wpf - ItemsControl ItemTemplate 绑定(bind)

c# - 如何合并两个复杂类型的 HashSet 并保留第二组中的重复项?

c# - 需要强制 Windows 窗体应用程序在启动时运行

c# - Apache 点燃,C# : Thin Client unable to connect to server node

c# - 在调用 CompleteAdding 后添加到 BlockingCollection

.net - 样式不适用于 Win7 x32 (.Net 4.0)