2011-02-23 15 views
5

¿Esto contiene una pérdida de memoria? He intentado comprender mejor las fugas de memoria, pero no puedo decir si he corregido esto. Si no, ¿cómo puedo deshacerme correctamente del objeto SPweb y SPSite?Pérdida de memoria de 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++; 
     } 
    } 
} 

Respuesta

13

Sí, lo hace. Usted se deshace de SPWeb pero se olvida de deshacerse de SPSite.
La forma correcta de hacer esto:

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

Tenga en cuenta que esto es equivalente a:

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

pero omite los apoyos para externo using para reducir código de anidación. Las reglas de refuerzo son las mismas que para if.

Algunas observaciones estilísticas:

  • Por favor, don't use Systems Hungarian in C# code. Solo list.
  • Los comentarios que reformulan el código anterior no tienen ningún sentido. Manténgalos constructivos, es decir, explicando el propósito del código. algo en lugar de esos cuatro comentarios, que debería haber escrito así en el principio:

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

+1. Este es el artículo que necesita leer si trabaja con objetos SPxxx - http://msdn.microsoft.com/en-us/library/aa973248.aspx –

+0

¿A qué se refiere cuando dice simplemente List? – atrljoe

+0

Utiliza la notación húngara para nombrar variables, es decir, prefija sus nombres de variable con abreviaturas de nombre de tipo. Entiendo 'o' significa' objeto'. Sin embargo, esto es absolutamente innecesario en C# porque tiene un sistema de tipo fuerte y VS es un IDE potente con funciones como IntelliSense. Te aconsejo que uses 'sitio web' en lugar de' oWebsite', 'list' en lugar de' oList', 'lists' (o' allLists') en lugar de 'collList', etc. –

2

No está disponiendo objeto SPSite en su uso, solamente SPWeb.

0

Otros han respondido a su pregunta, pero voy a añadir que usted debe estar ejecutando su construye a través SPDisposeCheck: http://archive.msdn.microsoft.com/SPDisposeCheck
No es perfecto pero se inclinará a muy corta edad a un montón de problemas.