2011-02-23 6 views
5

Questo contiene una perdita di memoria? Ho cercato di capire meglio le perdite di memoria, ma non posso dire se ho corretto questo? In caso contrario, in che modo si eliminano correttamente l'oggetto SPweb e l'oggetto SPSite?Perdita di memoria SharePoint

using (SPWeb oWebsite = new SPSite(webUrl).OpenWeb()) //Open SP Web 
{ 
    SPListCollection collList = oWebsite.Lists; //Open Lists 

    foreach (SPList oList in collList) 
    //For Each List Execute this 
    { 
     if (!oList.Hidden) 
     //If the list is hidden do this else nothing 
     { 
      ListSitesDropDownBox.Items.Add(new ListItem(SPEncode.HtmlEncode(oList.Title), SPEncode.HtmlEncode(oList.Title))); 
      ViewState["Item" + counter] = SPEncode.HtmlEncode(oList.Title); 
      counter++; 
     } 
    } 
} 

risposta

13

Sì, lo fa. Disponi di SPWeb ma dimentica lo smaltimento di SPSite.
Il modo giusto per fare questo:

using (var site = new SPSite(webUrl)) 
using (var web = site.OpenWeb()) { 
    // ... 
} 

noti che questo è equivalente a:

using (var site = new SPSite(webUrl)) { 
    using (var web = site.OpenWeb()) { 
     // ... 
    } 
} 

ma omesso bretelle per esterno using per ridurre codice nesting. Le regole di controvento sono le stesse di if.

Qualche osservazione stilistiche:

  • prega, don't use Systems Hungarian in C# code. Solo list.
  • I commenti che riformulano il codice sopra non hanno alcun senso. Mantenerli costruttivi, cioè spiegando lo scopo del codice. qualcosa invece di quelle quattro osservazioni, si dovrebbe aver scritto così che in principio:

    // Populate drop-down list with list names and save them in ViewState 
    
+2

+1. Questo è l'articolo che devi leggere se lavori con oggetti SPxxx - http://msdn.microsoft.com/en-us/library/aa973248.aspx –

+0

a cosa ti riferisci quando dici solo List? – atrljoe

+0

Si utilizza la notazione ungherese per denominare le variabili, ad esempio prefisso i nomi delle variabili con le abbreviazioni dei nomi dei tipi. Capisco che 'o' sta per' object'. Tuttavia questo è assolutamente inutile in C# perché ha un sistema di tipo forte e VS è un IDE potente con funzionalità come IntelliSense. Vi consiglio di usare 'website' invece di' oWebsite', 'list' invece di' oList', 'lists' (o' allLists') al posto di goffa 'collList' et cetera. –

2

Non di gettare via oggetti SPSite nel vostro usando, solo SPWeb.

0

Altri hanno risposto alla tua domanda, ma io aggiungo che si dovrebbe essere in esecuzione il tuo costruisce attraverso SPDisposeCheck: http://archive.msdn.microsoft.com/SPDisposeCheck
Non è perfetto, ma si punta voi fuori presto per un sacco di problemi.