在阅读了有关处理对象的Stefan Gossner's post和有关Cross method dispose patterns的问题之后,我发现我因意外重新打开某些SPWeb而感到内。我知道在Stefan Gossner的帖子中,他提到您在处理完所有子对象之后都应该处置SPWeb。但是,microsoft documentation提到了缓存SPListItemCollection对象。以下代码正确吗?返回的SPListItemCollection是否会重新打开SPWeb对象?有什么办法可以确定吗?
// is this correct????
private SPListItemCollection GetListItems()
{
SPListItemCollection items = null;
try
{
using (SPSite site = new SPSite(GetListSiteUrl()))
{
using (SPWeb web = site.OpenWeb())
{
// retrieve the list
SPList list = web.Lists[_ListName];
// more code to create the query...
items = list.GetItems(query);
}
}
}
catch (Exception e)
{
// log error
}
return items;
}
编辑09/09/09
我主要是指Stefan Grossner's post的这一部分:
我相信他在说的是,如果在处置了我用来获得SPWeb的SPWeb之后使用SPListItemCollection,则会自动重新打开SPWeb。
最佳答案
在asking Stefan directly之后,我发现SPListItemCollection确实可以在处置SPWeb之后重新打开SPWeb。这意味着我上面发布的代码是错误的,并且只有在使用SPListItemCollection之后才能处置SPWeb。
更新:最好将SPListItemCollection转换为其他内容,然后将其返回。
private DataTable GetListItems()
{
DataTable table = null;
try
{
SPListItemCollection items = null;
using (SPSite site = new SPSite(GetListSiteUrl()))
{
using (SPWeb web = site.OpenWeb())
{
// retrieve the list
SPList list = web.Lists[_ListName];
// more code to create the query...
items = list.GetItems(query);
// convert to a regular DataTable
table = items.GetDataTable();
}
}
}
catch (Exception e)
{
// log error
}
return table;
}