在 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/