Wann sollte Dispose aufgerufen werden, wenn SPContext.Site an eine Klassenbibliothek übergeben wird?
Frage
Ich bin nur auf der Suche nach einer kleinen Überprüfung dieser Sache!
Ich schaue mir viele Kurse an, die das haben SPSite
oder SPWeb
als Konstruktor für die Klasse.
Die Klasse wird mit instanziiert SPContext.Site
als SPSite-Parameter
z.B.
public MyClass {
SPWeb _web;
public MyClass(SPSite site) {
_web = site.RootWeb;
}
// Other methods that make use of _web
}
Sollen _web
entsorgt werden?Ist _web nur ein Zeiger auf SPContext.Site.RootWeb oder gibt es eine andere Kopie von SPWeb
die entsorgt werden müssen?
Das kenne ich mit SPContext.Site.OpenWeb()
Du solltest anrufen Dispose()
.
Was ist also mit der oben genannten Verwendung?
Wird passieren SPSite
/ SPWeb
Wenn Sie es einer lokalen Variablen zuweisen, wird immer nur auf dieselbe verwiesen SPContext
?
Lösung
In Ihrem Fall _web
muss nicht entsorgt werden, da Sie es von erhalten RootWeb
und abgerufene Webobjekte RootWeb
müssen nicht entsorgt werden.
EIDT
Auch wenn die SPSite
Das als Parameter an den Konstruktor übergebene Objekt wird von abgeleitet SPContext
, es muss nicht entsorgt werden.Andernfalls muss es je nach Anforderung entweder in der aufgerufenen Klasse oder in der aufrufenden Klasse entsorgt werden.
Andere Tipps
Rufen Sie Dispose() nicht explizit für die SPSite.RootWeb-Eigenschaft auf.Die Entsorgungsbereinigung wird automatisch von SharePoint und dem .NET Framework durchgeführt.Bei vorhandenen SharePoint-Anpassungen wird die Entfernung von explizitem RootWeb Dispose empfohlen, um eine Grenzfallbedingung zu vermeiden, bei der SPContext.Current.Web mit SPSite.RootWeb identisch ist.Bei der Entsorgung von RootWeb können Probleme auftreten, wenn es von einer beliebigen Variante von SPContext bezogen wird (zum Beispiel:SPContext.Site.RootWeb, SPContext.Current.Site.RootWeb und GetContextSite(Context).RootWeb ).
Weitere Informationen finden Sie unter...MSDN