5

在阅读了Stefan Gossner关于处置对象的帖子和关于Cross method dispose patterns的这个问题之后,我发现我因不小心重新打开了一些 SPWeb 而感到内疚。我知道在 Stefan Gossner 的帖子中,他提到你应该在处理完任何子对象后处理 SPWeb。但是,微软文档提到缓存 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 的这部分帖子

您应该在最后一次访问此对象的子对象后释放 SPWeb 或 SPSite 对象。

我相信他的意思是,如果我在处理掉我用来获取它的 SPWeb 后使用 SPListItemCollection ...... SPWeb 将自动重新打开。

4

3 回答 3

4

我在直接询问 Stefan后发现,SPListItemCollection 确实可以在你处理掉它之后重新打开 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;
}
于 2009-09-09T15:23:06.833 回答
1

据我所知,答案是否定的,但我会编写类似的代码

private void FetchItems(Action<SPListItemCollection> action)
{
   using(...)
   {
       var items = list.GetItems(query);
       action(items);
   }
}

通过这样做,要调用此方法,您需要沿(委托)发送一个应该使用 SPListItemCollection 的方法,例如:

FetchItems( items => ....) 或 FetchItems( DoStuffWithItems(SPListItemCollection) )

于 2009-09-08T17:11:34.260 回答
0

如果您在讨论使用 SPListItemCollection 时是否需要相同范围内的 SPWeb,我认为答案是否定的。

例如,我通常会执行以下操作:

    private IEnumerable<SPListItem> AllItems;

    public void GetItems()
    {
        var results = SPContext.Current.Web.Lists[ListName].Items.Cast<SPListItem>();
        this.AllItems = results;
    }

然后我到处使用 AllItems,它工作正常。

如果您想知道,演员表已经完成,所以我可以在结果集上使用 Linq - 比向列表提交查询要快得多,特别是如果您正在对数据执行多个子选择。

于 2009-09-08T22:48:23.207 回答