我应该处理这些Spsite和spweb对象吗?
题
是否有必要在以下代码中处理站点和Web对象?如果是这样,我该怎么做?
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Dim site As New SPSite(SPContext.Current.Web.Url)
Dim web As SPWeb = site.OpenWeb()
web.AllowUnsafeUpdates = True
Dim lPmr As SPList = web.Lists("NombreList")
Dim oQuery As New SPQuery()
Dim itemCollectionPMR As SPListItemCollection
oQuery = New SPQuery()
oQuery.Query = ""
itemCollectionPMR = lPmr.GetItems(oQuery)
........
End Sub
解决方案
詹姆斯和托尼是绝对正确的,但错过了明显的恕我直言 - 您的代码有更深的缺陷,如果您修复了这一点,则不需要处理对象。
您应该(在可能的情况下)使用Spcontext的Spweb和Spsite对象 - 它们已经由SharePoint Web Part基础架构为您创建,并且使用它们比创建自己的更有效。
在您的代码中,您实际上已经在使用其中之一来获取当前的网络URL,但是无论如何都可以创建自己的网站和网络 - 效率低下且不必要。
所以而不是
Dim site As New SPSite(SPContext.Current.Web.Url)
Dim web As SPWeb = site.OpenWeb()
你应该只使用
Dim web As SPWeb = SPContext.Current.Web
如果您从Spcontext使用Spsite/spweb而不是创建自己的Spweb,那么您不应该处理它们(您没有创建它们,因此请不要独自一人)
看 MSDN-最佳实践:使用一次性Windows SharePoint服务对象
Spcontext对象由SharePoint框架管理,不应在您的代码中明确处理。对于Spcontext.Site,Spcontext.Current.Site,Spcontext.Web和Spcontext.Current.Web返回的Spsite和Spweb对象也是如此。
其他提示
是的,您需要处理通过spsite.openweb()创建的SPWEB。
要处理它,请在方法中完成时简单调用web.dispose()。
您也可以将使用的语句使用相同的效果,而无需直接调用Dispose()
Using site As New SPSite(SPContext.Current.Web.Url)
Using web As SPWeb = site.OpenWeb()
web.AllowUnsafeUpdates = True
Dim lPmr As SPList = web.Lists("NombreList")
Dim oQuery As New SPQuery()
Dim itemCollectionPMR As SPListItemCollection
oQuery = New SPQuery()
oQuery.Query = ""
itemCollectionPMR = lPmr.GetItems(oQuery)
End Using
End Using
+1詹姆斯
您还应该尝试使用 SharePoint Dispose Checker工具 在您的项目中,以分析您的代码,以获取潜在的内存泄漏并应用最佳实践。