2010-09-07 6 views
1

Si j'attribue SPContext.Current.Site.OpenWeb().Title à une chaîne, dois-je m'en débarrasser (si possible)?Comment éliminer correctement les objets SP sans les affecter?

string title = SPContext.Current.Site.OpenWeb().Title; 

Je suis encore un peu flou sur le moment de disposer des objets sp, donc je toujours ôter de mes SPWeb et SPSite objets ... Mais, si je n'attribue pas la déclaration ci-dessus à un objet premier , y a-t-il une disposition à faire? Je comprends aussi qu'il y a certains cas où l'utilisation de Current élimine le besoin de disposer.

Merci.

Répondre

2

Généralement, peu importe si vous enregistrez ou non la référence - OpenWeb crée un nouvel objet SPWeb en mémoire et doit être supprimé. Cela est vrai pour tous les objets IDisposable, pas seulement dans SharePoint - ce n'est pas la référence qui fait la différence, ou le garbage collector pourrait libérer cette mémoire.

Vous devez changer votre code:

string title = null; 
using(SPWeb web = SPContext.Current.Site.OpenWeb()) 
{ 
    title = web.Title; 
} 

En théorie, vous avez créé une nouvelle SPSite vous devriez avoir disposé ainsi, mais pas quand il vient de SPContext.Current - ces objets peuvent être partagés avec autres composants.

+0

Super, merci. Mais, cela signifie-t-il que tout code utilisant le titre de la variable devrait être dans la clause using? – Josh

+0

@Josh: Non, le titre est placé dans une chaîne managée et ne doit pas être détruit, car aucun type de chaîne géré ne doit être éliminé. –

+0

Hmmm .... Je viens de lire ceci dans Best Practices pour disposer des objets WSS: Les objets SPContext sont gérés par le framework SharePoint et ne devraient pas être explicitement éliminés dans votre code. Cela est également vrai pour les objets SPSite et SPWeb renvoyés par SPContext.Site, SPContext.Current.Site, SPContext.Web et SPContext.Current.Web. – Josh

3

En fait, il s'agit d'un cas où la disposition est redondante. Ça ne va pas causer de problèmes, donc il n'y a pas de mal à prendre l'habitude, alors vous pouvez laisser ça pour le moment. Il est redondant car toute ouverture de site Web utilisant openweb sera automatiquement éliminée lorsque le site propriétaire sera éliminé. Le site contextuel est et non vous le possédez, il sera donc éliminé par sharepoint à un moment donné dans le futur, avec tous les sites ouverts via openweb. Mécontents: jetez un oeil au code openweb dans le réflecteur pour vérifier.

+0

Wow intéressant ... a du sens cependant. Je pensais que tu étais fou quand j'ai lu ça pour la première fois. :) –

+0

@kit - oui, c'est intéressant, et non, je ne suis pas folle;) ce comportement rend la disposition interne classique sur un nouveau spsite/openweb en utilisant le combo également redondant. – x0n