c# - Cuál es la diferencia entre SPContext.Current.Web.Site.OpenWeb(). Lista["Lista"]; y SPContext.Current.Web.Lists["Lista"]?
sharepoint-2010 (4)
Tengo que refactorizar algunos códigos sharepoint 2010 de mi colega. Cada vez que necesita acceder a una lista, lo hace:
SPContext.Current.Web.Site.OpenWeb().Lists["List"];
Solía hacer esto:
SPContext.Current.Web.Lists["List"];
¿Cuál es la diferencia entre estos dos y cuál es la forma más eficiente?
El segundo es mucho más eficiente.
En el primer método, está creando un nuevo objeto SPWeb
través de la llamada OpenWeb()
que es una llamada costosa. Tenga en cuenta solo eso, también debe disponer explícitamente este objeto manualmente cuando termine de usar eso.
Lea aquí: http://msdn.microsoft.com/en-us/library/aa973248(v=office.12).aspx
De acuerdo con Madhur
Use el 2º enfoque ya que no hará ninguna fuga de memoria
Por cierto: en SP2010 hay un nuevo método para obtener SPList
SPContext.Current.Web.Lists.TryGetList ("ListName");
usa eso
Madhur tiene razón sobre el código caro. Primero pensé que estaba equivocado acerca de deshacerse de él explícitamente, pero también tiene razón en eso. De acuerdo con la documentación de Best Practices:
Los objetos SPContext son gestionados por el marco de SharePoint y no deberían eliminarse explícitamente en su código. Esto es cierto también para los objetos SPSite y SPWeb devueltos por SPContext.Site, SPContext.Current.Site, SPContext.Web y SPContext.Current.Web.
Sin embargo, está utilizando el método OpenWeb () en un objeto SPContext que devuelve un nuevo objeto SPWeb si observa el ensamblado decompilado. Por lo tanto, debe eliminarse explícitamente.
Otro punto en lugar del rendimiento es que la instrucción SPContext.Current.Web.Site.OpenWeb().Lists["List"]
accederá a la lista List
de la colección de sitios actual mientras que la línea SPContext.Current.Web.Lists["List"];
accederá a la lista desde la web actual , pero no desde la colección de sitios actual.
Considera este escenario ...
Considere que hay una lista de Employee
en la colección de sitios http://[web-app]/sites/sa
.
Y hay un subsitio en-us en una colección de sitios.
Luego, si usa esta línea SPContext.Current.Web.Lists["List"];
entonces intentará encontrar la lista en la web dentro de sa / en-us que a su vez arrojará un error.
Sin embargo, utilizando la instrucción SPContext.Current.Web.Site.OpenWeb().Lists["List"];
encontrará la lista en una colección de sitios y se ejecutará correctamente.