我有一个一次性物品清单,我正在添加到已经包含许多一次性物品的集合中.我将代码包装在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()被调用两次.我有一个解决方案,但我想我会把它交给社区,看看是否有其他选择.
这可能导致那些被处置的物体再次被丢弃
哪个应该没问题.Dispose()的合同非常具体:多次调用它应该是安全的.
但摆脱它的另一种方法:
分析你的逻辑我会说这finally部分是多余的,也许分析师也这么认为.你确实两次解决同样的问题.
| 归档时间: |
|
| 查看次数: |
2191 次 |
| 最近记录: |