使用一次性使用SharePoint对象(Web部件)

vin*_*nny 2 c# sharepoint

在SharePoint中编写Web部件时,您是否通过using子句实现IDisposable ?或者,你处理了你的物品try/catch/finally?都?要看?你为什么选择一个而不是另一个?

背景:

我正在研究一些未实现IDisposable的继承代码,所以我一直在阅读以解决问题.MSDN有一篇很好的文章涵盖了"最佳实践":

http://msdn.microsoft.com/en-us/library/aa973248.aspx

建议using,但接着说,在许多情况下,不建议使用using.

Ada*_*Kee 5

我能理解文章中的含糊之处 - 真正的答案就像泥浆一样清晰:)

当涉及Web部件开发(或通常使用SharePoint API进行开发)时,如果不正确地实例化对象,则处理某些对象(特定地,SPOM对象)将产生不可预测的结果.

特别是,如果从当前上下文获得对SPSite或SPWeb的对象引用并尝试处理它(使用using子句或try/finally),则会从SharePoint堆栈中获取对象引用错误.

处理SP对象(SPSite,SPWeb等)的正确方法是使用URL从站点实现新的SP对象(而不是使用上下文来获取它).例如:

using (SPSite siteCollection = new SPSite("http://your_site_url"))
{
  using (SPWeb site = siteCollection.OpenWeb("News"))
  {
    //do stuff with your news web
  }
}
Run Code Online (Sandbox Code Playgroud)

下面是一个代码示例,如果您尝试使用它将引发对象引用错误:

using(contextSite = SPControl.GetContextSite(Context))
{
  using (SPWeb site = siteCollection.OpenWeb("News"))
  {
    //do stuff with your news web
  }
}
Run Code Online (Sandbox Code Playgroud)

在使用块期间不会发生此错误,但是当SharePoint尝试在站点内部执行某些操作时,将在下游发生此错误.

在一般用途方面,如果你有一个IDisposable对象,我是使用()而不是try/finally的忠实粉丝.我唯一一次选择try/finally是我需要在解除分配非IDisposable对象时做额外的逻辑.

希望这可以帮助!