В чем разница между SPContext.Current.Web.Site.OpenWeb (). Lists ["List"];и SPContext.Current.Web.Lists ["Список"]? - PullRequest
4 голосов
/ 09 января 2012

Мне нужно провести рефакторинг некоторого кода sharepoint 2010 от моего коллеги.Каждый раз, когда ему нужно получить доступ к списку, он делает это:

SPContext.Current.Web.Site.OpenWeb().Lists["List"];

Раньше я делал это:

SPContext.Current.Web.Lists["List"];

В чем разница между этими двумя и в чем более эффективный способ?

Ответы [ 4 ]

4 голосов
/ 09 января 2012

Второй способ гораздо эффективнее.

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

Читайте здесь: http://msdn.microsoft.com/en-us/library/aa973248(v=office.12).aspx

1 голос
/ 11 августа 2012

Еще один фактор производительности - оператор SPContext.Current.Web.Site.OpenWeb().Lists["List"] будет обращаться к списку List из коллекции текущего сайта , а строка SPContext.Current.Web.Lists["List"]; будет обращаться к списку из текущий веб , но не из текущего семейства сайтов.


Рассмотрим этот сценарий ...

Предположим, что в семействе сайтов существует список Employee http://[web-app]/sites/sa.

И в нашем сайте есть дочерний сайт.

Затем, если использовать эту строку SPContext.Current.Web.Lists["List"];, он попытается найти список в сети внутри sa / en-us, который, в свою очередь, выдаст ошибку.

При использовании оператора SPContext.Current.Web.Site.OpenWeb().Lists["List"]; найдет список в семействе сайтов sa и успешно запустится.

1 голос
/ 10 января 2012

Согласен с Мадхур

Используйте 2-й подход, поскольку он не приведет к утечке памяти

Кстати: в SP2010 появился новый способ получить SPList

SPContext.Current.Web.Lists.TryGetList ( "ИМЯ_СПИСОК");

используйте это

0 голосов
/ 22 января 2013

Мадхур прав насчет дорогого кода.Сначала я подумал, что он был неправ в том, что он явно выбрасывал это, но и в этом он прав.Согласно документации Best Practices:

Объекты SPContext управляются средой SharePoint и не должны явно размещаться в вашем коде.Это также верно для объектов SPSite и SPWeb, возвращаемых SPContext.Site, SPContext.Current.Site, SPContext.Web и SPContext.Current.Web.

Однако вы используете метод OpenWeb ()на объекте SPContext, который возвращает новый объект SPWeb, если вы посмотрите на декомпилированную сборку.Следовательно, его необходимо утилизировать явно.

...