C# SPContext.Current.Web.Site.OpenWeb()列表[“List”与;和SPContext.Current.Web.Lists[“List”]?

C# SPContext.Current.Web.Site.OpenWeb()列表[“List”与;和SPContext.Current.Web.Lists[“List”]?,c#,sharepoint-2010,web,spcontext,C#,Sharepoint 2010,Web,Spcontext,我必须从我的同事那里重构一些sharepoint 2010代码。每次他需要访问列表时,他都会这样做: SPContext.Current.Web.Site.OpenWeb().Lists["List"]; 我曾经这样做过: SPContext.Current.Web.Lists["List"]; 这两种方法有什么区别?哪种方法更有效?第二种方法更有效 在第一种方法中,您通过OpenWeb()调用创建一个新的SPWeb对象,这是一个昂贵的调用。请注意,在使用完该对象后,还必须手动显式地处理该对

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

SPContext.Current.Web.Site.OpenWeb().Lists["List"];
我曾经这样做过:

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

这两种方法有什么区别?哪种方法更有效?

第二种方法更有效

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

请看这里: 同意马杜尔的观点

使用2st方法,因为它不会造成任何内存泄漏

顺便说一下:在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中存在一个员工列表

sa网站集上有子网站en us

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


使用语句
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对象。因此,需要明确处理。

请将此问题转移到