Dois-je disposer ces objets SPSite et SPWeb?
Question
Est-il nécessaire de disposer du site et des objets Web dans le code suivant? Si oui, comment puis-je faire?
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
La solution
James et Toni sont tout à fait correct, mais ont manqué à mon humble avis l'évidente -. Votre code a un défaut plus profond et si vous avez résolu ce alors disposer les objets n'est pas nécessaire
Vous devriez (si possible) utiliser le SPWeb et SPSite objets de SPContext -. Ils sont déjà créés pour vous par la partie Web SharePoint infrastructure et son plus efficace d'utiliser ces que de créer votre propre
Dans votre code que vous utilisez en fait déjà l'un d'entre eux pour obtenir l'URL actuelle des toiles, mais puis en créant votre propre site web et quel que soit -. Assez inefficace et pas nécessaire
au lieu de
Dim site As New SPSite(SPContext.Current.Web.Url)
Dim web As SPWeb = site.OpenWeb()
Vous devez utiliser simplement
Dim web As SPWeb = SPContext.Current.Web
Si vous utilisez SPSite / SPWeb de SPContext ceux-ci plutôt que de créer votre propre alors vous ne devriez pas disposer d'eux (vous ne les avez pas créé, afin de les laisser seuls)
MSDN - Meilleures pratiques: Utilisation Disposable Windows SharePoint Services Objets
Les objets SPContext sont gérés par le cadre de SharePoint et ne doit pas être mis au rebut de façon explicite dans votre code. Cela est vrai aussi pour les objets SPSite et SPWeb retourné par SPContext.Site, SPContext.Current.Site, SPContext.Web et SPContext.Current.Web.
Autres conseils
Oui, vous devez disposer SPWebs créées par SPSite.OpenWeb ().
Pour en disposer, web.Dispose simple appel () lorsque vous avez terminé dans la méthode.
Vous pouvez également utiliser l'instruction avec le même effet, sans avoir besoin d'appeler directement 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 James
Vous devriez aussi essayer d'utiliser l'outil SharePoint Éliminez Checker dans vos projets pour analyser votre code pour les fuites de mémoire potentiels et appliquer les meilleures pratiques.