4

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

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

我曾经这样做:

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

这两者有什么区别以及更有效的方法是什么?

4

4 回答 4

4

第二种是更有效的方式。

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

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

于 2012-01-09T09:46:31.603 回答
1

同意马杜尔

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

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

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

用那个

于 2012-01-10T06:37:44.440 回答
1

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


考虑这种情况......

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

并且在 sa 站点集合中有子站点 en-us。

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

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

于 2012-08-11T11:52:18.663 回答
0

Madhur 关于昂贵的代码是正确的。我首先认为他明确地处理它是错误的,但他也是对的。根据最佳实践文档:

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

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

于 2013-01-22T00:22:02.420 回答