SPContext.Current.Web.Site.OpenWeb()之间有什么区别。列出[“List”];和SPContext.Current.Web.Lists [“List”]?

时间:2012-01-09 09:40:46

标签: c# sharepoint-2010 web spcontext

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

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

我曾经这样做过:

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

这两者之间有什么区别,哪种更有效?

4 个答案:

答案 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对象。因此,需要明确处理。