В чем разница между 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, если вы посмотрите на декомпилированную сборку. Следовательно, он должен быть расположен явно.