代码之家  ›  专栏  ›  技术社区  ›  Mina Wissa

在sharepoint中释放对象?

  •  1
  • Mina Wissa  · 技术社区  · 15 年前

    我读了msdn关于在 http://msdn.microsoft.com/en-us/library/ee557362(office.14).aspx

    现在我真的很困惑。 考虑这个例子

    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);
    
                 }
    

    或者没什么区别

    谢谢

    3 回复  |  直到 13 年前
        1
  •  3
  •   Russell Giddings    15 年前

    在这种情况下,您不需要处理spweb,因为您没有创建它。如果您负责实例化一个spweb对象(和spsite对象),则只需要释放该对象。

    因此,在下面的实例中,您需要调用dispose(或者使用“using”语句自动访问dispose),因为您要负责更新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 . 此工具将分析您的程序集,并指出所有可能有未分解对象的位置。太棒了!-)

        2
  •  2
  •   naivists    15 年前

    我读了一篇关于 SPWeb 有一次,上面说“spweb就像一个可爱的女孩——如果它不是你的,不要碰它,如果它是你的——照顾好它”。

    因此,如果您创建了一个新的spweb类实例,则必须对其进行处理。如果你从别的地方拿走的话 SPContext.Current 对象-保持原样。

    更新
    哦,我找到了 the post 有点不同:

    Dispose就像一个漂亮的女孩,如果你 看吧,叫它…但不要打破 规则1。也就是说,不要叫美女 这并没有被证实是独立的,…如果 她的大哺乳动物男友发现 出去,他可能会把你的牙齿打掉。这个 规则也适用于General.net。

        3
  •  1
  •   John Ptacek    15 年前

    只是说清楚,因为你引用的链接是sharepoint 2010…wss 3.0和sharepoint 2010基础(本质上是wss 4.0)之间有几个更改,其中之一是不再需要处理spweb对象,而只需要在using块中从spsite引用spsite对象。似乎与你提供的链接有点不同步。我不确定该文档是否过期或将被更新。但是,我已经多次听到spweb不需要dispose调用。在阅读了那篇文章之后,现在还不确定在什么情况下这是真的。随着发行日期的临近,我认为会有进一步的扩展。

    关于上面引用的代码,正如其他人所说,因为您没有创建对象,所以不必管理该对象。事实上,如果从spcontext对象中获取spsite(以及wss 3.0中的spweb),那么如果处理该对象,则会遇到sharepoint问题,因为sharepoint运行时已将其实例化。

    如上所述,spdisposechecker是一个非常有用的工具。Roger Lamb还有一篇很好的文章解释了Dispose最佳实践

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

    http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx