关于如何避免两次处理对象的建议

Ɖia*_*zeƦ 4 c# dispose

我有一个一次性物品清单,我正在添加到已经包含许多一次性物品的集合中.我将代码包装在try ... finally块中,这样如果在我将列表中的项目复制到集合时抛出异常,则列表中的所有对象都会被正确处理:

private static void LoadMenuItems(ApplicationMenu parent)
{
    List<ApplicationMenuItem> items = null;
    try
    {
        items = DataContext.GetMenuItems(parent.Id);
        foreach (var item in items)
        {
            parent.Items.Add(item);
        }
        items = null;
    }
    finally
    {
        if (items != null)
        {
            foreach (var item in items)
            {
                item.Dispose();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果在将多个对象添加到集合后发生异常,我将遇到集合包含一些已处置对象的情况.这可能会导致在下面的try ... catch块中再次处理这些被处置的对象:

try
{
    // Assume that menu.Items contains some items prior
    // to the call to LoadMenuItems.
    LoadMenuItems(menu);
}
catch
{
    // The Dispose() iterates through menu.Items calling 
    // Dispose() on each.
    menu.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

所以我正在寻找可能的解决方案来阻止Dispose()被调用两次.我有一个解决方案,但我想我会把它交给社区,看看是否有其他选择.

Hen*_*man 5

这可能导致那些被处置的物体再次被丢弃

哪个应该没问题.Dispose()的合同非常具体:多次调用它应该是安全的.


但摆脱它的另一种方法:

分析你的逻辑我会说这finally部分是多余的,也许分析师也这么认为.你确实两次解决同样的问题.