これらの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パーツインフラストラクチャによってすでに作成されており、独自の作成よりも使用する方が効率的です。
あなたのコードでは、実際にそれらのいずれかをすでに使用して現在のWeb URLを取得していますが、それに関係なく独自のサイトとWebを作成しています - かなり非効率的で必要ありません。
その代わりに
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-ベストプラクティス:使い捨てWindows SharePoint Servicesオブジェクトの使用
SpContextオブジェクトは、SharePointフレームワークによって管理されており、コードに明示的に廃棄するべきではありません。これは、spcontext.site、spcontext.current.site、spcontext.web、およびspcontext.current.webによって返されるspsiteおよびspwebオブジェクトにも当てはまります。
他のヒント
はい、spsite.openweb()を介して作成されたspwebsを処分する必要があります。
それを処分するには、メソッドが完了したら、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はチェッカーツールを処分します プロジェクトでは、潜在的なメモリリークについてコードを分析し、ベストプラクティスを適用します。