考虑以下摘自 Microsoft docs 的代码:
using FileStream createStream = File.Create(fileName);
// ...write to stream etc..
await createStream.DisposeAsync(); // <- isn't this done automatically because of the using clause in the first line`?
调用 DisposeAsync()
方法不是多余的吗?
最佳答案
using
子句将调用 Dispose()
方法,而不是 DisposeAsync()
。这是不一样的,因为 Dispose()
正在阻止调用并且 DisposeAsync
的存在表明 dispose 可能是资源密集型的,所以你不想调用 Dispose
如果您可以改为调用 DisposeAsync
。
编写的代码将首先调用 DisposeAsync
,然后在作用域的末尾还会调用 Dispose
。我们可以假设它是无害的,因为实现类应该检查资源是否已经被释放,所以第二个 Dispose
应该什么都不做。但是,如果您使用 C#8+,则可以使用 await using
:
await using FileStream createStream = File.Create(fileName);
这与 using
相同,但它会在范围末尾调用 await DisposeAsync()
,而不是 Dispose
。所以就像你现在做的那样,但是自动(并且在 finally block 中)。它适用于 IAsyncDisposable
目标(例如 FileStream
继承自 Stream
,它实现了 IAsyncDisposable
)。
关于c# - 将 FileStream 与 using 子句一起使用时,是否需要在 FileStream 上调用 DisposeAsync?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75095154/