Размещать объект в sharepoint? - PullRequest
1 голос
/ 02 марта 2010

Я прочитал статью 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 ]

3 голосов
/ 02 марта 2010

В этом случае вам не нужно утилизировать SPWeb, поскольку вы его не создавали. Утилизировать объект SPWeb (и объект SPSite) нужно только в том случае, если вы отвечаете за создание экземпляра объекта.

Таким образом, в следующем случае вам нужно будет вызвать dispose (или автоматически утилизировать с помощью оператора using), так как вы отвечали за обновление 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 голосов
/ 02 марта 2010

Однажды я прочитал заявление о SPWeb, в котором говорилось: «SPWeb похож на симпатичную девочку - если она не твоя, не трогай ее, если она твоя - береги ее».

Итак, если вы создали новый экземпляр класса SPWeb, вы должны его утилизировать. Если вы взяли его откуда-то еще - объект SPContext.Current - оставьте его как есть.

UPDATE
О, я нашел пост , и он немного другой:

Распоряжаться как симпатичная девушка, если ты видеть это, называть это ... но не ломаться Правило № 1. то есть не называй симпатичную девушку это не подтверждено неприсоединенным, если ее большой парень млекопитающих находит он может выбить тебе зубы. это правило распространяется и на общий .NET.

1 голос
/ 02 марта 2010

Просто для ясности, поскольку ссылка, на которую вы ссылаетесь, относится к SharePoint 2010 ... Между фондами WSS 3.0 и SharePoint 2010 (в основном WSS 4.0) произошли некоторые изменения, одним из которых является то, что вам больше не нужно распоряжаться объект SPWeb, только объект SPSite при обращении с сайта SPSite в блоке using. Кажется, что-то не совпадает с предоставленной вами ссылкой. Я не уверен, что эта документация устарела или будет обновлена. Однако я слышал, что SPWeb не нуждается в вызове dispose несколько раз. Не уверен, в каком контексте это верно сейчас после прочтения этой статьи. Что-то, что будет дополнительно расширено, я предполагаю, что приближается дата релиза.

В отношении кода, на который вы ссылаетесь выше, он, как говорили другие, поскольку вы не создали объект, вам не нужно управлять объектом. Фактически, если вы получите SPSite (и SPWeb в WSS 3.0) от объекта SPContext, вы столкнетесь с проблемами с SharePoint, если избавитесь от объекта, поскольку экземпляр среды выполнения SharePoint его создал.

Как уже упоминалось выше, SPDisposeChecker - очень полезный инструмент. У Роджера Лэмба также есть отличная статья, рассказывающая о лучших методах утилизации

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...