Я могу понять причину в статье - реальный ответ так же ясен, как и грязь:)
Когда дело доходит до разработки веб-частей (или разработки с использованием API SharePoint в целом), удаление определенных объектов (в частности, объектов SPOM) приведет к непредсказуемым результатам, если вы не будете правильно создавать экземпляры своих объектов.
В частности, если вы получите ссылку на объект на SPSite или SPWeb из текущего контекста и попытаетесь избавиться от него (с помощью выражения using или try / finally), вы получите ошибку ссылки на объект из стека SharePoint .
Правильный способ избавиться от ваших объектов SP (SPSite, SPWeb и т. Д.) - это создать новый объект SP (в отличие от использования контекста для его получения) с сайта, используя URL-адрес. Например:
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
}
}
Ошибка не возникнет во время использования блока, но возникнет позже, когда SharePoint попытается что-то сделать с сайтом внутренне.
С точки зрения общего использования, я большой поклонник использования () вместо try / finally, если у вас есть IDisposable объект. Единственный раз, когда я выбираю try / finally, - это если мне нужно выполнить дополнительную логику вокруг отмены выделения неидентифицируемых объектов.
Надеюсь, это поможет!