这几天我一直在讨论这个话题。我查看了几个博客并使用 SPDisposeChecker.exe 进行了一些测试。关于何时必须调用 Dispose() 似乎有各种想法。例如 Christian Glessner 的这个博客:
http://www.ilovesharepoint.com/2010/03/sharepoint-disposing-myths.html
表示不必一直使用 SPWeb 处理 Web。
但是,Microsoft 最佳实践建议处置任何 Openweb。http://msdn.microsoft.com/en-us/library/aa973248(v=office.12).aspx
在以下代码块上(有点旧并且不在 Using 块内)::
try
{
SPSite site = new SPSite("http://mysite.aspx");
web = site.OpenWeb();
site.Dispose();
site = null;
}
catch (System.IO.FileNotFoundException x)
{
return;
}
如果我使用 SPDisposeCheck 进行快速检查,则会出现错误:
“一次性类型不处置”在 web = site.OpenWeb(); 的行上
但是当我放一个 finally 块时:
finally
{
if (web != null)
web.Dispose();
}
SPDisposeCheck 给出以下错误:“注意:不应在此对象上调用 Dispose”
做了一些研究,我发现 SPDispose 有一些错误,正如这个博客所解释的那样
所以我对我的研究仍然有点不满意。我的意思是,遵循 Microsoft 的最佳实践是好的,它建议始终使用 Dispose()。但是,对于何时以及何时不处置,我仍然不完全满意。
此外,“当您处理 SPSite 时,它会遍历“m_openedWebs”中的所有 SPWeb 并在每个上调用 Close 方法”这是正确的说法吗?
回到我的代码块,这里真的需要一个 SPWeb.Dispose(在 finally 块上)吗?