Aggiornamento 06/08/2009 15:52: Risposta breve NO. domanda di carattere originale:SPWeb.Site, dovresti chiamare Dispose() su di esso?
Non riesco a trovare alcun riferimento che dia indicazioni su SPWeb.Site relativo allo smaltimento. Ho passato attraverso alcuni dei più popolari documentazione di migliori pratiche in materia di smaltimento di oggetti di SharePoint:
- http://www.sharepointdevwiki.com/display/public/When+to+Dispose+SharePoint+objects
- http://msdn.microsoft.com/en-us/library/aa973248.aspx
- http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx
Purtroppo nessuna di queste linee guida menziona SPWeb.Site. Per dare un po 'di contesto, sto scrivendo un API di estensione pubblico che accetta uno SPWeb come argomento di un metodo e cioè:
public static void GetWebPartFromCatalog(this SPWeb web, string webPartName)
{
......
SPSite site = web.Site;
......
**OR** ??
using (SPSite site = web.Site)
{
....
}
}
Ho guardato come il metodo Close() in refelector per SPWeb, che si chiama da SPWeb.Dispose() e non vi è nulla in esso per indicare che il campo membro SPSite effettivo è stato eliminato.
Aggiornamento: 06/08/2009 13:47
A Alex's suggerimento
"Mettilo in un ciclo che corre 100 volte e utilizzare la chiave di registro SPRequestStackTrace descritto nella risoluzione dei problemi SPSite/SPWeb perdite in WSS v3 e MOSS 2007 per verificare che il codice di prova sia la fonte del problema. "
ho eseguito il seguente pezzo di codice incluso all'interno di un webpart:
for (int i = 0; i < 100; i++)
{
using (SPWeb web = SPContext.Current.Site.OpenWeb(""))
{
SPSite site = web.Site;
Debug.WriteLine(site.Url);
}
}
Nulla sembrava nei registri di SharePoint.
Anche se esiterei a trarre qualsiasi conclusione reale da questo esperimento ingenuo, suggerirei che sia lo non lo necessario per smaltire SPWeb.Site. Sarebbe davvero bello ricevere una risposta concreta da qualcuno più informato su questo argomento.
Aggiornamento: 06/08/2009 14:52 Spinto dal commento di Greg Ho lavorato le cessioni di m_Site e sembra che è in ultima analisi, sempre passò nelle SPWeb tramite i costruttori interni. Per esempio. SPWeb.OpenWeb passa in questo al nuovo SPWeb(). Quindi sono più sicuro che SPWeb.Site dovrebbe non essere smaltito, infatti potrebbe causare problemi se lo fosse.
Guardando in questo, non è chiaro. Ho fatto la stessa domanda come commento al post di Roger Lamb ma non ho avuto risposta. –
Secondo me, ed è solo questo, un'opinione, no, non dovresti mai dover smaltire quell'oggetto. Perché? Bene, viene restituito attraverso una proprietà da un altro oggetto. Se quell'altro oggetto è usa e getta, dovresti disporre di * that * e lasciare che si prenda cura delle proprie risorse. Nulla di ciò che leggi da una proprietà dovrebbe essere eliminato dal tuo stesso codice, che costituirebbe un bug in quella struttura. –
@ lasse-v-karlsen Sono d'accordo con te al 100%, tuttavia ci sono molte stranezze nell'API di SharePoint e hai davvero bisogno di capirle o rischiare di perdere memoria. Quindi, anche se potrebbe essere un bug nell'API, vorrei capire se è presente o meno :) –