将使用从disposed'派生的`SPList'对象。OpenWeb()'导致错误?
题
将使用 SPList
从已处置的对象派生的对象 .OpenWeb()
导致错误?
SPList list = null;
using (SPWeb web = SPContext.Current.Site.OpenWeb("/myweb")){
list = web.Lists["Awesome Name"];
}
SPListItemCollection items = list.Items;
解决方案
不,不会有错误。我通常使用这种设计模式来保持我的 using
块小。
SPList list;
using (SPWeb web = SPContext.Current.Site.OpenWeb("myweb"))
{
list = web.GetList("/myweb/Lists/Awesome Name");
}
SPListItemCollection items = list.Items;
如果您正在更新 SPListItem
以需要的方式 SPWeb.AllowUnsafeUpdates = true;
不过,你需要保持对 SPWeb
(即:做所有的工作 using
块。)
有关何时需要设置 AllowUnsafeUpdates
财产,见赫里斯托巴甫洛夫的 你需要知道的关于AllowUnsafeUpdates.这是我找到的最好的解释。
我经常这样做,所以我的代码中没有那么多嵌套块。它使它更干净。一旦你检索一个列表,它就存储在内存中。如果您只在您的 using
块。如果在加载列表的时间和请求值的时间(例如从项目)之间更改了某些内容,则获得的值是首先加载列表时存在的值。
这也是为什么如果你只得到几个列表,你应该使用 SPWeb.GetList()
而不是 SPWeb.Lists[index]
. SPWeb.Lists
在第一次调用时加载web中的所有列表。 GetList()
每次都进行数据库调用,但如果web中有很多列表,则加载到内存中的次数要少得多。这是一个权衡。