[英]“Access to disposed closure” warning in using statement
我正在使用“使用语句”来确保StreamWriter被正确清理。
using (StreamWriter fout = new StreamWriter(tempFile))
{
data.ForEach(line => fout?.WriteLine(line));
}
我收到ReSharper警告“访问已关闭的封闭”,据我了解,这是因为变量fout
可能已封闭。 我了解在某些情况下可能会发生的情况,但是在这种情况下,调用WriteLine
时是否可能已经fout
?
欢迎使用堆栈溢出。
ReSharper的“ Access to disposed closure
警告仅应在LINQ延迟执行捕获到对可能在执行发生之前已关闭的关闭的引用时发生。
在这种情况下,是否取决于所调用的ForEach
方法。 如果您要调用List.ForEach
那么您就不会构成延迟执行链,因此fout
显然对每次调用都有效。 ReSharper在使用这种方法时肯定应该更加了解。
但是,还有其他ForEach
方法,包括自定义方法,ReSharper可能不知道这些方法,或者实际上可能会延迟。 如果它们写的很好,它们将阻塞直到它们完成为止,但是我看到了自定义的ForEach
扩展方法。 由于ReSharper不能确定,除非代码在action参数上使用InstantHandle
注释告诉它,所以它会警告您。
如果您在这里使用List.ForEach
,那么我建议您放弃它,而使用一个很好的foreach
语句。 对于其他扩展,请确定其是否阻塞,或者是否有可能在任何情况下推迟执行。 Observable.ForEach
和Parallel.ForEach
都似乎阻止执行,直到完全处理了集合或事件源关闭为止。 其他代码可能不会这样做,而事后寻找这样的错误可能会很痛苦。 如果可以,请检查方法的源;如果无法访问源,请与库开发人员联系。
一旦确定此ForEach
肯定会阻塞并且从不延迟执行,则可以继续操作并取消警告:
// ReSharper disable AccessToDisposedClosure
data.ForEach(line => fout?.WriteLine(line));
// ReSharper restore AccessToDisposedClosure
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.