网站开发流程进度规划,南昌做seo的公司,完成公司网站建设,呼和浩特腾讯企业邮箱SPSite对象
通常在调用SPSite对象构造函数后#xff0c;你需要在使用完后调用Dispose方法来清空对象。但是#xff0c;如果你使用SPControl.GetContextSite来获取对象那么你不能使用Dispose来清空对象。因为通过这种方式获得的SPSite或者SPWeb对象会保留一份内部列表信息你需要在使用完后调用Dispose方法来清空对象。但是如果你使用SPControl.GetContextSite来获取对象那么你不能使用Dispose来清空对象。因为通过这种方式获得的SPSite或者SPWeb对象会保留一份内部列表信息当使用Dispose对象后可能会产生无法预测的错误。实际上WSS会在页面结束后清空这些对象。 下面我们分析一下有关SPSite类的方法和属性会产生对象以及如何清空这些对象 SPSiteCollection类 1.SPSiteCollection.Add方法通过这个方法会创建并返回一个SPSite对象在不需要使用该对象后你应该清除内存中的对象。 例 SPGlobalAdmin oSPGlobalAdmin new SPGlobalAdmin(); SPSiteCollection aSites oSPGlobalAdmin.VirtualServers[0].Sites; SPSite oSPSite aSites.Add( ... ); ... Process the site info ... oSPSite.Dispose(); oSPGlobalAdmin.Dispose(); 通过SPSiteCollection [ ] 索引来获得SPSite在下面的例子是没有及时清除没有的对象的范例。 int j; SPSite oSPSite; SPGlobalAdmin oSPGlobalAdmin new SPGlobalAdmin(); SPSiteCollection aSites oSPGlobalAdmin.VirtualServers[0].Sites; for (j 0;j aSites.Count;j) { oSPSite aSites[j]; BuildTableRow(oDisplayTable, Site, oSPSite.Url); } oSPGlobalAdmin.Dispose(); 这里我们建议在循环中加入Dispose方法以清空产生的SPSite对象例 int j; SPSite oSPSite; SPGlobalAdmin oSPGlobalAdmin new SPGlobalAdmin(); SPSiteCollection aSites oSPGlobalAdmin.VirtualServers[0].Sites; for(j 0;j aSites.Count;j) { oSPSite aSites[j]; BuildTableRow(oDisplayTable, Site, oSPSite.Url); oSPSite.Dispose(); } oSPGlobalAdmin.Dispose(); 2.SPSite.AllWebs属性 SPSites.AllWebs.Add方法创建并返回SPWeb对象在不需要使用该对象后你应该清除内存中的对象例 SPWeb oSPWeb; SPSite oSPSite SPControl.GetContextSite(Context); oSPWeb oSPSite.AllWebs.Add( ... ); ... Process the SPWeb info ... oSPWeb.Dispose(); 3.SPSite.AllWebs [ ] 索引操作在每次访问对象后会返回SPWeb实例下面的例子会产生大量SPWeb对象。 int j; SPWeb oSPWeb; SPSite oSPSite SPControl.GetContextSite(Context); for(i0;j oSPSite.AllWebs.Count; j) { oSPWeb oSPSite.AllWebs[j]; BuildTableRow(oDisplayTable, Web, oSPWeb.Title); } 建议在循环中调用Dispose方法清除对象例 int j; SPWeb oSPWeb; SPSite oSPSite SPControl.GetContextSite(Context); for(j 0;j oSPSite.AllWebs.Count; j) { oSPWeb oSPSite.AllWebs[j]; BuildTableRow(oDisplayTable, Web, oSPWeb.Title); oSPWeb.Dispose(); } 或者 int j; SPWeb oSPWeb; SPSite oSPSite SPControl.GetContextSite(Context); for(j 0;j oSPSite.AllWebs.Count; j) { using(oSPWeb oSPSite.AllWebs[j]) { BuildTableRow(oDisplayTable, Web, oSPWeb.Title); } } 4.SPSite.OpenWeb 和 SPSite. SelfServiceCreateSite 方法这两个方法都会返回SPWeb对象你应该按照下面例子方式处理SPWeb对象。 SPSite oSPSite new SPSite(http://Server); SPWeb oSPWeb oSPSite.OpenWeb(..); ... additional processing ... oSPWeb.Dispose(); oSPSite.Dispose(); 5.SPSite.LockIssue, SPSite.Owner, and SPSite.SecondaryContact 属性 由于这3个属性会产生SPSite.RootWeb引用所以清空对象方法应该如下 String str; SPSite oSPSite new SPSite(http://server); str oSPSite.LockIssue; oSPSite.RootWeb.Dispose(); oSPSite.Dispose(); 6.SPSite.RootWeb 属性 在之前提到过RootWeb属性在利用RootWeb的属性后需要使用清空相关对象例 String str; SPSite oSPSite new SPSite(http://server); str oSPSite.RootWeb.Title; ... additional processing ... oSPSite.RootWeb.Dispose(); oSPSite.Dispose();SPWeb 对象 1.SPWeb.ParentWeb属性第一次调用SPWeb.ParentWeb的时候它会判断赋值的成员变量是否是NULL值如果成员变量为NULL并且上级站点那么它自动调用OPERWEB方法产生一个SPWeb对象下次在访问时候只是返回保存在变量中的值。 例 String str; SPSite oSPSite new SPSite(http://server); SPWeb oSPWeb, oSPWebParent; oSPWeb oSPSite.OpenWeb(); oSPWebParent oSPWeb.ParentWeb; if (oSPWebParent ! null) { ... additional processing ... } if (oSPWebParent ! null) oSPWebParent.Dispose(); oSPWeb.Dispose(); oSPSite.Dispose(); 2.SPWeb.Webs 属性 SPWeb.Webs.Add 方法创建并返回SPWeb对象在不需要使用该对象后你应该清除内存中的对象例 SPWeb oSPWeb SPSite oSPSite SPControl.GetContextSite(Context); oSPSWeb oSPSite.AllWebs.Add( ... ); ... Process the SPWeb info ... oSPWeb.Dispose(); 3.SPWeb.Webs[ ] 索引操作和SPSite.Webs相同在每次访问对象后会返回SPWeb实例下面的例子会产生大量SPWeb对象。 int j; SPWeb oSPWeb, oSPWeb2; SPSite oSPSite SPControl.GetContextSite(Context); oSPWeb oSPSite.OpenWeb(); for(j 0;j oSPWeb.Webs.Count;j) { oSPWeb2 oSPWeb.Webs[j]; BuildTableRow(oDisplayTable, Web, oSPWeb2.Title); } 建议在循环中清除对象。 int j; SPWeb oSPWeb, oSPWeb2; SPSite oSPSite SPControl.GetContextSite(Context); oSPWeb oSPSite.OpenWeb(); for(j 0;j oSPWeb.Webs.Count;j) { oSPWeb2 oSPWeb.Webs[j]; BuildTableRow(oDisplayTable, Web, oSPWeb2.Title); oSPWeb2.Dispose(); } oSPWeb.Dispose();其他需要清除的对象 1.Microsoft.SharePoint.Portal.SiteData.Area.Web 属性在每次访问后返回一个新的SPWeb对象。在使用后应该及时清除对象。 例 String str; Area oArea AreaManager.GetArea(PortalContext.Current, new Guid(AreaGiud); SPWeb oSPWeb oArea.Web; str oSPweb.Title; str oSPWeb.Url; ... oSPWeb.Dispose(); 或者 String str; Area oArea AreaManager.GetArea(PortalContext.Current, new Guid(AreaGiud); using(SPWeb oSPWeb oArea.Web) { str oSPweb.Title; str oSPWeb.Url; } 2.SPControl.GetContextSite和 SPControl.GetContextWeb 方法在前面有提到这里方法返回对象不能通过Dispose来清除可能会产生不可预期的错误。以下做法是错误的 SPSite oSPSite SPControl.GetContextSite(..); ... additional processing ... oSPSite.Dispose(); 正确的方法应该是 SPSite oSPSite SPControl.GetContextSite(..); SPWeb oSPWeb oSPSite.OpenWeb(..); ... additional processing ... oSPWeb.Dispose(); 或者 SPSite oSPSite SPControl.GetContextSite(..); using(SPWeb oSPWeb oSPsite.OpenWeb()) { ... additional processing ... } 3.WebPartPage.RootWeb 属性和SPSite.RootWeb 属性相同。只有当WebPartPage.IsRootWeb为True时才需要清除对象例如 String str; WebPartPage oWebPartPage new WebPartPage(); str oWebPartPage.RootWeb.Title; ... additional processing ... if(oWebPartPage.Web.IsRootWeb oWebPartPage.Dispose(); 大部分Sharepoint对象都实现IDisposable接口当你不使用对象时应该清除该对象避免在内存中保存过多对象。