我有一个一次性元素列表,我要将其添加到已经包含许多一次性元素的集合中。我将代码包装在一个 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/