![]() |
1
31
确实,泄露dispose方法的异常可能非常糟糕,特别是因为实现IDisposable的东西通常会指定一个finalizer来调用dispose。 很难调试的情况
你真的不想把OutOfMemoryException隐藏起来吗? 如果我有一个狡猾的第三方组件,它在Dispose上任意抛出异常,我会将其修复并将其托管在一个单独的进程中,当它开始运行时,我可以将其拆掉。 |
![]() |
2
4
如果你怀疑食品处理()引发异常,如果可能的话,我会最后处理它,并将其包装在try/catch中。尽一切可能在catch中除去它-将引用设置为null。从Dispose()抛出异常是非常糟糕的,应该避免。 不幸的是,如果这是有缺陷的第三方代码,最好的办法就是让他们修复它。你不应该在它之后手动清理。
|
![]() |
3
2
|
![]() |
4
1
因为您不必在using()语句中分配变量—为什么不为此使用“stacked”using语句呢?
因此Dispose()调用放在单独的finally块中:
old Joe Duffy blog post (参见C1和VB部分,使用语句、C++堆栈语义)。在IDisposable上,Joe Duffy的帖子被许多StackOverflow答案引用。我还找到了一个 recent question 对于局部变量使用语句似乎很常见。我找不到最后几个街区的锁链 C# language spec (C#3.0规范中的第8.13节),并且仅适用于单个“using”块中的多个变量,这与我的建议不完全相同,但是如果您分解IL,您会发现try/finally块是嵌套的。在null检查中,同样来自C规范:“如果获取了null资源,则不会调用Dispose,也不会引发异常。” |
![]() |
5
1
Dispose不应该抛出任何异常。如果它写得不好,那么
|
![]() |
6
0
为了避免重复处理对象的代码,我编写了以下静态方法。
主要的一点是,你可以使它成为一个函数,所以你只能键入 每个对象一行 在您的情况下,您可能需要添加异常处理,或者使用异常处理创建不同的风格。我会确保您在Dispose()抛出异常时记录/断点,但是如果您无法阻止它,那么下一个最好的方法就是确保问题不会扩散。 |
![]() |
7
0
在我的例子中,这是因为一个线程在关闭窗体时访问UI元素。我通过中止窗体close上的线程来解决它。(“FormClosing”事件)
|
![]() |
A B · C#Excel自动调整列避免长文本时出错 4 月前 |
![]() |
pseudodev · 失败的测试仅显示堆栈跟踪,不显示完整日志 5 月前 |
![]() |
CactusCake · if语句中应有分号 6 月前 |
![]() |
Bin4ry · 子文件夹中的应用程序设置 6 月前 |