在阅读了有关处理对象的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;
}

09-27 21:32