C# SPContext.Current.Web.Site.OpenWeb()列表[“List”与;和SPContext.Current.Web.Lists[“List”]?
我必须从我的同事那里重构一些sharepoint 2010代码。每次他需要访问列表时,他都会这样做: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对象,这是一个昂贵的调用。请注意,在使用完该对象后,还必须手动显式地处理该对
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对象。因此,需要明确处理。请将此问题转移到