2010-03-02 54 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