更新于 2009 年 6 月 8 日 15:52:简答NO。原始问题:
我找不到任何关于SPWeb.Site处置指导的参考资料。我浏览了一些关于处置 SharePoint 对象的更流行的最佳实践文档:
- http://www.sharepointdevwiki.com/display/public/When+to+Dispose+SharePoint+objects
- http://msdn.microsoft.com/en-us/library/aa973248.aspx
- http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx
不幸的是,这些指南都没有提到 SPWeb.Site。为了给出一些上下文,我正在编写一个公共扩展 API,它接受 SPWeb 作为方法的参数,即:
public static void GetWebPartFromCatalog(this SPWeb web, string webPartName)
{
......
SPSite site = web.Site;
......
**OR** ??
using (SPSite site = web.Site)
{
....
}
}
我在 SPWeb 的反射器中查看了 Close() 方法,该方法由 SPWeb.Dispose() 调用,其中没有任何内容表明实际的 SPSite 成员字段已被处理。
更新:2009 年 6 月 8 日 13:47
在亚历克斯的建议下
“将其放入一个运行 100 次的循环中,并使用在 WSS v3 和 MOSS 2007 中排除 SPSite/SPWeb 泄漏中描述的 SPRequestStackTrace 注册表项来检查您的测试代码是否是问题的根源。”
我运行了 webpart 中包含的以下代码:
for (int i = 0; i < 100; i++)
{
using (SPWeb web = SPContext.Current.Site.OpenWeb(""))
{
SPSite site = web.Site;
Debug.WriteLine(site.Url);
}
}
SharePoint 日志中未显示任何内容。
虽然我会犹豫从这个幼稚的实验中得出任何真正的结论,但这表明没有必要处置 SPWeb.Site。如果能从对此主题更了解的人那里得到具体的回答,那就太好了。
更新:2009 年 6 月 8 日 14:52 由 Greg 的评论提示,我计算出了 m_Site 的分配,看起来它最终总是通过内部构造函数传递给 SPWeb。例如,SPWeb.OpenWeb 将其传递给new SPWeb()。所以我更确定 SPWeb.Site 不应该被处置,如果是的话,确实会导致问题。