是否有必要在以下代码中处理站点和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工具 在您的项目中,以分析您的代码,以获取潜在的内存泄漏并应用最佳实践。

许可以下: CC-BY-SA归因
scroll top