2009-05-04 30 views
2

在SharePoint中编写Web部件时,是否通过using子句实现IDisposable?或者,你是否在try/catch/finally中处理了你的对象?都?依靠?你为什么选择一个呢?对SharePoint对象使用一次性(Web部件)

背景:

我的工作有点遗传代码,而无需实现IDisposable,所以我一直在读了纠正问题。 MSDN有一个很好的文章涵盖了“最佳实践”:

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

该建议using,但随后继续说,在许多情况下,它是不建议使用using

回答

5

我能理解文章中的abiguity - 真正的答案是泥:)

清晰当涉及到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对象,那么我会非常喜欢使用()over try/finally。我选择try/finally的唯一时间是如果我需要在取消分配非IDisposable对象时执行额外的逻辑。

希望这会有所帮助!

+0

(+1)现在肯定不太浑浊,谢谢! – vinny 2009-05-04 16:08:01

相关问题