我阅读了有关在http://msdn.microsoft.com/en-us/library/ee557362(office.14).aspx
中处理对象的msdn文章现在我对此感到困惑。 考虑这个例子
SPList List = SPContext.Current.Web.Lists["DemoList"];
SPListItem Item = List.GetItemById(ItemID);
可以使用它或更好地使用:
using (SPWeb web = SPContext.Current.Web)
{
SPList List= web.Lists["DemoList"];
SPListItem Item = List.GetItemById(ItemID);
}
或没有区别
感谢
答案 0 :(得分:3)
在这种情况下,您不需要丢弃SPWeb,因为您没有创建它。如果您负责实例化对象,则只需要处理SPWeb对象(和SPSite对象)。
因此,在以下实例中,您需要调用dispose(或使用“using”语句自动处理),因为您负责新建SPSite ..
void CombiningCallsBestPractice()
{
using (SPSite siteCollection = new SPSite(SPContext.Current.Web.Url))
{
using (SPWeb web = siteCollection.OpenWeb())
{
// Perform operations on site.
} // SPWeb object web.Dispose() automatically called.
} // SPSite object siteCollection.Dispose() automatically called.
}
“using”语句等同于在块结尾处调用web.Dispose(),但更具可读性,并且不太可能忘记处理。
如果您担心SharePoint代码中是否有任何不公开的对象,我强烈建议您使用SPDisposeCheck。该工具将分析您的装配并指出您可能拥有一个未曝光对象的所有位置。这很棒! : - )
答案 1 :(得分:2)
我曾经读过一篇关于SPWeb
的声明,其中说“SPWeb就像一个可爱的女孩 - 如果它不是你的,不要碰它,如果它是你的 - 照顾它”。
因此,如果您创建了一个新的SPWeb类实例,则必须对其进行处理。如果你从其他地方拿走它 - SPContext.Current
对象 - 保持原样。
UPDATE
哦,我发现the post并且它有点不同:
如果你的话,Dispose就像一个漂亮的女孩 看到它,称之为......但不要打破 规则1。即不要叫一个漂亮的女孩 这是未经证实的,如果 她的大型哺乳动物男友发现 他可能会把你的牙齿敲掉。这个 规则也适用于一般.NET。
答案 2 :(得分:1)
需要明确的是,因为您引用的链接是SharePoint 2010 ... WSS 3.0和SharePoint 2010 Foundations(主要是WSS 4.0)之间有一些更改,其中一个是您不再需要处理SPWeb对象,在使用块中从SPSite引用时仅为SPSite对象。似乎与您提供的链接有点不同步。我不确定该文档是否已过期或将更新。但是,我听说SPWeb不需要多次处理掉电话了。在阅读该文章之后,现在还不确定在什么情况下是真的。随着发布日期临近,我会假设将会进一步扩展。
关于您在上面引用的代码,正如其他人所说,因为您还没有创建对象,所以您不必管理对象。实际上,如果从SPContext对象获得SPSite(以及WSS 3.0中的SPWeb),则在处置对象时将遇到SharePoint问题,因为SharePoint运行时会对其进行实例化。
如上所述,SPDisposeChecker是一个非常有用的工具。 Roger Lamb也有一篇很好的文章解释了Dispose best practices