在 SharePoint 中编写 Web 部件时,您是否通过 using
子句实现 IDisposable?或者,您是否在 try/catch/finally
中处理您的对象?两个都?依靠?你为什么选择其中一个而不是另一个?
背景:
我正在编写一些未实现 IDisposable 的继承代码,因此我一直在阅读以纠正问题。 MSDN 有一篇很好的文章介绍了“最佳实践”:
http://msdn.microsoft.com/en-us/library/aa973248.aspx
建议using
,但接着又说,在许多情况下,不建议使用using
。
最佳答案
我能理解文章中的含糊之处 - 真正的答案是清晰如泥:)
当涉及到 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 block 期间发生,但稍后当 SharePoint 尝试在网站内部执行某些操作时,就会在下游发生。
就一般用途而言,如果您有 IDisposable 对象,我非常喜欢使用()而不是 try/finally。我选择 try/finally 的唯一一次是如果我需要围绕取消分配非 IDisposable 对象执行额外的逻辑。
希望这有帮助!
关于c# - 将 Disposable 与 SharePoint 对象(Web 部件)结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/820577/