SPWeb.Site,你应该调用Dispose()吗?

Edw*_*lde 18 sharepoint dispose

更新日期06/08/2009 15:52:简短回答NO.原始问题:

我找不到任何关于SPWeb.Site关于处理的指导.我已经阅读了一些关于处理SharePoint对象的最流行的最佳实践文档:

不幸的是,这些指南都没有提到SPWeb.Site.为了给出一些上下文,我正在编写一个公共扩展API,它接受SPWeb作为方法的参数,即:

public static void GetWebPartFromCatalog(this SPWeb web, string webPartName)
{
     ......

     SPSite site = web.Site;
     ......

     **OR** ??

     using (SPSite site = web.Site)
     {
         ....
     }
}
Run Code Online (Sandbox Code Playgroud)

我在SPWeb的refelector中看起来像是Close()方法,由SPWeb.Dispose()调用,并且它没有任何内容表明实际的SPSite成员字段被处理掉了.

更新:2009年8月6日13:47

Alex的建议下

"将它放在一个运行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);
     }
 }
Run Code Online (Sandbox Code Playgroud)

SharePoint日志中没有任何内容.

虽然我会毫不犹豫地从这个天真的实验中得出任何真正的结论,但它表明没有必要处置SPWeb.Site.从更加了解这个主题的人那里得到一个具体的答案真的很好.

更新:06/08/2009 14:52 Greg的评论提示我制定了m_Site的赋值,看起来它最终总是通过内部构造函数传递给SPWeb.例如SPWeb.OpenWeb通过在这个新的SPWeb().所以,我更确信SPWeb.Site应该被布置,的确会产生问题,如果它是.

Rex*_*x M 8

柯克的回答是正确的.在创建SPWeb之前,您必须拥有一些SPSite句柄,这与调用SPWeb.Site时的SPSite实例相同.

让我们仔细思考一下它的含义 - 如果你不控制SPSite的创建,但是它的一个子网是从外部代码传递给你的,并且你处理了网站,当控制返回到调用代码时,你'我们处置了一个他们可能无法完成的网站!把自己放在调用代码中:将SPWeb传递给方法,当该方法完成后,您使用的SPSite已经关闭.清理他们分配的资源始终是实施者的责任.在这种情况下,请勿丢弃SPSite.


Kir*_*ohn 5

只是想到我的头顶(有时危险)......

如果没有SPSite,您似乎无法拥有SPWeb.因此,如果你没有通过SPSite获得SPWeb(通过执行新的SPSite或提供给你的那个),那么你可能不必担心处置SPSite.

不过,这只是猜想.好问题!