【问题标题】:Using Disposable With SharePoint Objects (Web Parts)对 SharePoint 对象(Web 部件)使用 Disposable
【发布时间】:2009-05-05 01:17:44
【问题描述】:

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

背景:

我正在处理一些未实现 IDisposable 的继承代码,因此我一直在阅读以纠正问题。 MSDN 有一篇很好的文章,涵盖了“最佳实践”:

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

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

【问题讨论】:

    标签: c# sharepoint


    【解决方案1】:

    我能理解文章中的模棱两可——真正的答案一清二楚:)

    当涉及到 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
      }
    }
    

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

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

    错误不会在 using 块期间发生,但稍后会在 SharePoint 尝试在网站内部执行某些操作时发生。

    就一般用途而言,如果你有一个 IDisposable 对象,我非常喜欢 using() 而不是 try/finally。我唯一一次选择 try/finally 是如果我需要围绕取消分配非 IDisposable 对象执行额外的逻辑。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 2012-05-05
      • 2019-05-06
      • 2011-06-16
      • 1970-01-01
      相关资源
      最近更新 更多