我有一个一次性物品清单,我正在添加到已经包含许多一次性物品的集合中.我将代码包装在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();
}
}
}
}
如果在将多个对象添加到集合后发生异常,我将遇到集合包含一些已处置对象的情况.这可能会导致在下面的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();
}
所以我正在寻找可能的解决方案来阻止Dispose()被调用两次.我有一个解决方案,但我想我会把它交给社区,看看是否有其他选择.
解决方法:
Which could give rise to those disposed objects being disposed of again
哪个应该没问题. Dispose()的合同非常具体:多次调用它应该是安全的.
但摆脱它的另一种方法:
分析你的逻辑我会说最后的部分是多余的,也许分析师也这么认为.你确实两次解决同样的问题.
标签:c,dispose 来源: https://codeday.me/bug/20190613/1234610.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。