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