Pregunta

¿Qué es la mejor práctica con la declaración de uso al trabajar con los objetos de SharePoint? ¿Cuándo y cómo debe usar la declaración de uso, por lo que los objetos utilizados están dispuestos, etc.?

¿Fue útil?

Solución

La clave es que si su código crea una instancia de un SPSIT o SPWEB, debe deshacerse de él. Sin embargo, si usa una instancia de spContext.Current, no debe deshacerse de ella. es decir, dispone de lo que creas, ya sea directa o indirectamente.

Ejemplo de creación de su propia instancia, por lo que se requiere usar:

using(SPSite site = new SPSite("http://server"))
{
}

Ejemplo de usar un objeto existente de SPContext, por lo que no es necesario usar:

SPWeb web = SPContext.Current.Web;
SPSite site = SPContext.Current.Site;

Ejemplo de crear su propia instancia de un SPWEB llamando a OpenWeb ()::

using(SPWeb web = SPContext.Current.Site.OpenWeb("http://server/mywebsite"))
{
}

Además, tenga cuidado de deshacerse de los objetos incluso si se lanza una excepción, colocando la llamada de eliminación en el bloque Finalmente.

try
{
   site = new SPSite("http://server");
   web = site.OpenWeb();
}
catch(Exception e)
{
   //handle it
}
finally
{
   if (web != null)
      web.Dispose();

   if (site != null)
      site.Dispose();
}

Estos son solo algunos ejemplos, pero hay muchos otros. Aquí hay un buena referencia.

Además, puede usar el SpdisposeCheck herramienta.

Otros consejos

Hay una guía de mejores prácticas de Microsoft sobre cuándo deshacerse de qué objetos (SPSIT, SPWEB):http://msdn.microsoft.com/en-us/library/ee557362(v=office.14).aspx

También hay una herramienta de comprobación de disposición proporcionada por Microsoft:http://archive.msdn.microsoft.com/spdisposecheck

La regla de oro parece ser: si es dueño del objeto (es decir, lo creó usando el new operador), luego lo elimina. Si el objeto proviene de otro objeto creado por el modelo de objeto SharePoint, entonces no lo hace. Use spdisposeCheck para asegurarse de que Laurie indicó.

Si bien la respuesta anterior está bien, solo quiero agregar algunas cosas para mayor claridad.

Para ver si el objeto que está utilizando debe estar dispuesto, puede verificar la referencia de MSDN de la clase (presione F1 cuando el cursor esté en la declaración en VS) y verificar si la clase implementa idisible. Si es así, solo deseche el objeto si realmente hizo el objeto (con una nueva declaración o un método Openxxx () o similar).

La construcción de try-capch-finalmente nunca es necesaria para estos objetos si usa la declaración de uso, porque en la compilación la declaración de uso se convertirá en una constucción de try-capch-finalmente como se ve en el ejemplo final de Laurie. La declaración de uso es preferible porque es mucho más elegante y hará que su código sea más legible.

El spdisposeCheck parece una buena herramienta, pero con un poco de sentido común probablemente no la necesitará.

Licenciado bajo: CC-BY-SA con atribución
scroll top