【发布时间】:2019-01-25 03:58:18
【问题描述】:
我正在使用“using 语句”来确保 StreamWriter 被正确清理。
using (StreamWriter fout = new StreamWriter(tempFile))
{
data.ForEach(line => fout?.WriteLine(line));
}
我收到 ReSharper 警告“访问已处置的闭包”,据我了解,这是因为变量 fout 可能已关闭。我了解在某些用途中可能会发生这种情况,但在这种情况下,fout 是否可能在调用 WriteLine 时已经被处置?
【问题讨论】:
-
确切的答案是它完全取决于
ForEach方法在内部对给定委托所做的事情。我和你都知道这不会发生,但编译器无法确定,因此发出警告。 -
只要在使用后关闭流,在没有 using 语句的情况下对其进行编码应该不会有任何问题。但是是的,如果你不关闭它,它会导致许多程度的痛苦
-
这看起来像是 Resharper 警告,而不是编译器警告(您可能已经提到过)。我相信它的意思是传递给
ForEach的 lambda 委托有一个闭包,其中包含将由 Using 释放的变量。如果 ForEach 缓存了委托,它将在可能已被释放后访问fout。通读resharper-support.jetbrains.com/hc/en-us/community/posts/…。最后一篇文章(我认为是来自 Resharper 的人)主要解释了它
标签: c# resharper idisposable using-statement