Должен ли я утилизировать эти объекты SPSite и SpWeb?
Вопрос
Необходимо ли утилизировать сайт и веб -объекты в следующем коде? Если так, как мне это сделать?
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
Решение
Джеймс и Тони абсолютно правы, но пропустили очевидный IMHO - ваш код имеет более глубокий недостаток, и если вы исправите это, то утилизация объектов не требуется.
Вы должны (где это возможно) использовать объекты SPWEB и SPSITE из SPCONTEXT - они уже созданы для вас инфраструктурой веб -части SharePoint и более эффективными для их использования, чем создавать свои собственные.
В своем коде вы уже используете один из них, чтобы получить текущий URL -адрес Webs, но затем создаете свой собственный сайт и веб -сайт, независимо от - довольно неэффективно и не необходимо.
Так что вместо
Dim site As New SPSite(SPContext.Current.Web.Url)
Dim web As SPWeb = site.OpenWeb()
Вы должны использовать просто
Dim web As SPWeb = SPContext.Current.Web
Если вы используете SPSite/Spweb из Spcontext, а не создаете свой собственный, то вы не должны избавиться от них (вы не создали их, поэтому оставьте их в покое)
Видеть MSDN - Лучшие практики: использование одноразовых объектов SharePoint Services
Объекты SPCONTEXT управляются фреймворком SharePoint и не должны быть явно утилизированы в вашем коде. Это верно также для объектов SPSITE и SPWEB, возвращаемых spcontext.site, spcontext.current.site, spcontext.web и spcontext.current.web.
Другие советы
Да, вам нужно будет утилизировать Spwebs, созданные через spsite.openweb ().
Чтобы утилизировать это, простой Call 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 Tool В ваших проектах по анализу вашего кода для потенциальных утечек памяти и применения лучших практик.