我能理解文章中的模棱两可——真正的答案一清二楚:)
当涉及到 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 对象执行额外的逻辑。
希望这会有所帮助!