使用SharePoint对象时,使用使用语句的最佳实践是什么?您何时以及如何使用使用语句,因此使用的对象被处置了等?

有帮助吗?

解决方案

关键是,如果您的代码创建了SPSITE或SPWEB的实例,则必须处置它。但是,如果您使用spcontext的实例,则不应处理它。 IE处置您创建的内容,无论是直接还是间接。

创建自己的实例的示例,因此需要使用:

using(SPSite site = new SPSite("http://server"))
{
}

从Spcontext使用现有对象的示例,因此不需要使用:

SPWeb web = SPContext.Current.Web;
SPSite site = SPContext.Current.Site;

通过调用OpenWeb()来创建SPWEB实例的示例:

using(SPWeb web = SPContext.Current.Site.OpenWeb("http://server/mywebsite"))
{
}

另外,即使抛出异常,也要小心地处置对象,然后将处置呼叫放在最后块中。

try
{
   site = new SPSite("http://server");
   web = site.OpenWeb();
}
catch(Exception e)
{
   //handle it
}
finally
{
   if (web != null)
      web.Dispose();

   if (site != null)
      site.Dispose();
}

这些只是几个例子,但是还有很多例子。这里有一个 很好的参考.

此外,您可以使用 spdisposecheck 工具。

其他提示

Microsoft有关于何时处理哪些对象(SPSITE,SPWEB)的最佳实践指南:http://msdn.microsoft.com/en-us/library/ee557362(v=office.14).aspx

另外,Microsoft提供了一个处置检查器工具:http://archive.msdn.microsoft.com/spdisposecheck

黄金法则似乎是:如果您拥有该对象(即通过使用 new 操作员),然后处理它。如果对象来自SharePoint对象模型本身创建的另一个对象,则您不这样做。正如劳里(Laurie)所指出的那样,请使用spdisposecheck确保确保。

虽然上面的答案都很好,但我只想添加一些东西,以清楚一下。

要查看是否需要处置您使用的对象,您可以检查类的MSDN引用(在VS中的声明中按光标在声明时按F1),并检查类是否实现IDISPOSABLE。如果是这样,则仅在实际制作对象时(使用新语句或OpenXXX()方法或类似物)处置对象。

如果您使用使用该语句,则不需要这些对象的尝试键入构造,因为在汇编中,将转换为劳里(Laurie)的最终示例中所见,将使用使用语句转换为try-catch-catch-fin-fine constuction。使用语句是优选的,因为它更优雅,并且可以使您的代码更可读。

SpdisPosecheck似乎是一个不错的工具,但是有了一些常识,您可能不需要它。

许可以下: CC-BY-SA归因
scroll top