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"];
这两者之间有什么区别,更有效的方法是什么?
第二种方法更有效。
在第一种方法中,您将通过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对象。因此,需要明确处理。