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

标签 c# dispose

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

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();
            }
        }
    }
}

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

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();
}

所以我正在寻找可能的解决方案来阻止 Dispose() 被调用两次。我有一个解决方案,但我想我会把它提供给社区,看看是否有任何替代方案。

最佳答案

Which could give rise to those disposed objects being disposed of again

这应该没问题。 Dispose() 的约定非常具体:多次调用它应该是安全的。


但另一种摆脱它的方法:

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

关于c# - 关于如何避免两次处理对象的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8823418/

相关文章:

c# - 尝试不需要针对 x86 和 x64 程序的两个单独的解决方案

c# - System.TypeInitializationException : The type initializer for 'Tips' threw an exception

c# - 在 C# 中获取某个 DateTime 的星期一和星期日

c# - C# 一次性变量的自一次性(内联)声明

c# - 创建 Windows Phone 8 应用程序并将其连接到数据库的最佳方式(最好是 SQL Server)

c# - 将字符串中的数字范围转换为整数列表

c# - 在延续中使用一个对象,确保它在你需要它之​​前不会被释放

java - 调用 dispose 方法后访问模式对话框变量

c# - 类析构问题

VB.net 垃圾收集器不释放对象