SPContext.Current.Web.Site.OpenWeb().Lists[“列表”];和SPContext.

本文关键字:SPContext 列表 Lists Web Current Site OpenWeb | 更新日期: 2023-09-27 18:19:51

我必须从我的同事那里重构一些sharepoint 2010代码。每次他需要访问列表时,他都会这样做:

SPContext.Current.Web.Site.OpenWeb().Lists["List"];

我曾经这样做:

SPContext.Current.Web.Lists["List"];

这两者之间有什么区别,更有效的方法是什么?

SPContext.Current.Web.Site.OpenWeb().Lists[“列表”];和SPContext.

第二种方法更有效。

在第一种方法中,您将通过OpenWeb()调用创建一个新的SPWeb对象,这是一个代价高昂的调用。请注意,在使用完该对象后,还必须手动显式处理该对象。

阅读此处:http://msdn.microsoft.com/en-us/library/aa973248(v=office.12).aspx

同意Madhur

使用第二种方法,因为它不会造成任何内存泄漏

顺便说一句:在SP2010中,有一种新的方法可以获得SPList

SPContext.Current.Web.Lists.TryGetList("ListName");

使用

代替性能的另一点是,语句SPContext.Current.Web.Site.OpenWeb().Lists["List"]将从当前网站集合访问列表List,而行SPContext.Current.Web.Lists["List"];将从当前网站访问列表,但不能从当前网站集合访问。


考虑一下这种情况。。。

考虑在网站集http://[web-app]/sites/sa中存在列表Employee

还有一个子网站在我们的网站集。

然后,如果使用这行SPContext.Current.Web.Lists["List"];,那么它将尝试在sa/en-us内部的web中查找列表,这反过来又会引发错误。

使用语句SPContext.Current.Web.Site.OpenWeb().Lists["List"];将在网站集中找到该列表并成功运行。

Madhur对昂贵的代码说得对。我最初认为他明确处理这件事是错误的,但他也是对的。根据最佳实践文档:

SPContext对象由SharePoint框架管理,不应在代码中显式处理。对于SPContext.Site、SPContext.Current.Site、SPC ontext.Web和SPContext.Current.Web返回的SPSite和SPWeb对象也是如此。

但是,您正在对SPContext对象使用OpenWeb()方法,如果查看反编译的程序集,该方法将返回一个新的SPWeb对象。因此,需要明确处理。