繁体   English   中英

使用声明中的“进入已处置封口”警告

[英]“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.ForEachParallel.ForEach都似乎阻止执行,直到完全处理了集合或事件源关闭为止。 其他代码可能不会这样做,而事后寻找这样的错误可能会很痛苦。 如果可以,请检查方法的源;如果无法访问源,请与库开发人员联系。

一旦确定此ForEach肯定会阻塞并且从不延迟执行,则可以继续操作并取消警告:

// ReSharper disable AccessToDisposedClosure
data.ForEach(line => fout?.WriteLine(line));
// ReSharper restore AccessToDisposedClosure

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM