2010-03-02 52 views
1

我读了关于处理物体的msdn文章http://msdn.microsoft.com/en-us/library/ee557362(office.14).aspx在SharePoint中处理对象?

现在我对此非常困惑。 考虑这个例子

SPList List = SPContext.Current.Web.Lists["DemoList"]; 
SPListItem Item = List.GetItemById(ItemID); 

是它确定使用这个或者最好使用:

using (SPWeb web = SPContext.Current.Web) 
      { 
       SPList List= web.Lists["DemoList"]; 
       SPListItem Item = List.GetItemById(ItemID); 

      } 

或没有区别

感谢

回答

3

你并不需要处置在这种情况下,因为你没有创建SPWeb。如果您负责实例化对象,则只需处理SPWeb对象(和SPSite对象)。

因此,在以下情况下,你就需要调用dispose(或使用“使用”的声明已出售自动aclled)如你是负责新-ING起来的SPSite ..

void CombiningCallsBestPractice() 
{ 
    using (SPSite siteCollection = new SPSite(SPContext.Current.Web.Url)) 
    { 
     using (SPWeb web = siteCollection.OpenWeb()) 
     { 
      // Perform operations on site. 
     } // SPWeb object web.Dispose() automatically called. 
    } // SPSite object siteCollection.Dispose() automatically called. 
} 

的“使用“语句等同于在块的末尾调用web.Dispose(),但更具可读性,并且处置不太可能被遗忘。

如果您担心在SharePoint代码中是否存在任何未处理的对象,我强烈建议使用SPDisposeCheck。这个工具将分析你的装配,并指出你可能有一个未放置物体的所有地方。这很棒! :-)

2

我读了一次关于SPWeb的声明,其中说:“SPWeb就像一个可爱的女孩 - 如果它不是你的,不要触摸它,如果它是你的 - 照顾它”。

因此,如果您创建了SPWeb类的新实例,则必须对其进行处置。如果你从其他地方拿走它 - SPContext.Current对象 - 保持原样。

UPDATE
哦,我发现the post,它是有一点不同:

处置就像是一个漂亮的女孩,如果你 看到它,把它......但没有打破 规则#1。即不打电话给一个漂亮的女孩 ,这是没有证实独立,..如果她的大型哺乳动物男友 发现 出来,他可能会敲你的牙齿。这个 规则也适用于通用.NET。

1

要明确一点,因为您引用的链接是SharePoint 2010 ... WSS 3.0和SharePoint 2010 Foundations(本质上是WSS 4.0)之间有几处更改,其中之一是您不再需要处置SPWeb对象时,只有SPSite对象从SPSite中的using块中引用。似乎与您提供的链接有点不同步。我不确定该文档是否过期或将被更新。但是,我听说SPWeb不需要多次处理呼叫。不知道在阅读那篇文章后现在的情况是否属实。一些将会进一步扩展的内容我假设发布日期临近。

关于上面引用的代码,正如其他人所说的那样,由于您尚未创建该对象,因此不必管理该对象。事实上,如果您从SPContext对象中获得SPSite(和WSS 3.0中的SPWeb),则在处理该对象时,您将遇到SharePoint问题,因为SharePoint运行时将它实例化。

如上所述,SPDisposeChecker是一个非常有用的工具。罗杰·兰姆也有很大的文章,解释处置的最佳实践

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