我必须从我的同事那里重构一些 sharepoint 2010 代码。每次他需要访问列表时,他都会这样做:
SPContext.Current.Web.Site.OpenWeb().Lists["List"];
我曾经这样做:
SPContext.Current.Web.Lists["List"];
这两者有什么区别以及更有效的方法是什么?
我必须从我的同事那里重构一些 sharepoint 2010 代码。每次他需要访问列表时,他都会这样做:
SPContext.Current.Web.Site.OpenWeb().Lists["List"];
我曾经这样做:
SPContext.Current.Web.Lists["List"];
这两者有什么区别以及更有效的方法是什么?
第二种是更有效的方式。
在第一种方法中,您正在SPWeb
通过调用创建一个新对象,OpenWeb()
这是一个昂贵的调用。请注意,您还必须在使用完该对象后手动显式处理该对象。
在这里阅读:http: //msdn.microsoft.com/en-us/library/aa973248 (v=office.12).aspx
同意马杜尔
使用第二种方法,因为它不会造成任何内存泄漏
顺便说一句:在 SP2010 中,有一种获取 SPList 的新方法
SPContext.Current.Web.Lists.TryGetList("ListName");
用那个
代替性能的另一点是,该语句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 站点集合中找到该列表并成功运行。
Madhur 关于昂贵的代码是正确的。我首先认为他明确地处理它是错误的,但他也是对的。根据最佳实践文档:
SPContext 对象由 SharePoint 框架管理,不应在您的代码中显式释放。对于由 SPContext.Site、SPContext.Current.Site、SPContext.Web 和 SPContext.Current.Web 返回的 SPSite 和 SPWeb 对象也是如此。
但是,您在 SPContext 对象上使用 OpenWeb() 方法,如果您查看反编译的程序集,该对象将返回一个新的 SPWeb 对象。因此,它需要显式处理。