В чем разница между SPContext.Current.Web.Site.OpenWeb().Lists["List"]; и SPContext.Current.Web.Lists["Список"]?

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

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

Я использовал для этого:

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

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

4 ответа

Решение

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

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

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

Еще один момент вместо производительности заключается в том, что заявление 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"]; найдет список в семействе сайтов и успешно запустится.

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

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

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

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

использовать это

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

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

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

Другие вопросы по тегам