首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“使用”语句“是糟糕的代码”吗?

问“使用”语句“是糟糕的代码”吗?
EN

Stack Overflow用户
提问于 2012-03-26 19:10:21
回答 3查看 966关注 0票数 4

我读过这样的一种用法:

代码语言:javascript
复制
using (myObject)
{
   myObject.DoStuff();
}

可以这样想:

代码语言:javascript
复制
try
{
   myObject.DoStuff();
}
finally
{
   myobject.Dispose()
}

因此,如果myObejct.DoStuff抛出ExceptionA,然后myObject.Dispose()也抛出异常(ExceptionB),那么ExceptionA将丢失。(有关更好的描述,请参见这里的MSDN示例。)

这是否意味着如果使用块代码中的代码可能引发异常(这是大多数代码对吗?)那么using语句是一种糟糕的实践吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-26 19:14:17

这是否意味着如果使用块代码中的代码可能引发异常(这是大多数代码对吗?)那么使用语句是一种错误的做法吗?

不是的。

然后myObject.Dispose()也抛出一个异常

这是你问题的症结所在。

这就是“糟糕的做法”。应该真正设计IDisposable.Dispose实现,以便它们不会引发异常,除非是在真正无法恢复的情况下。

由于IDisposable实际上是为了释放所讨论的资源,所以主要的问题应该是确保在大多数情况下不会抛出这个实现。拥有一个清理方法抛出会引起很多的悲伤--这也是使用语句不应与WCF客户端一起使用等的原因。

话虽如此,我不认为使用语句本身是一个不好的做法。事实上,它往往是一种非常好的实践,因为它避免了一个非常常见的陷阱(在异常情况下缺少资源的一次性使用)。

票数 19
EN

Stack Overflow用户

发布于 2012-03-26 19:12:37

using语句确保正确地处理实现IDisposable的类型(也就是说,正确实现处置模式的是句法糖 )。

它们在很大程度上是良好实践。

拥有一个处置函数抛出是不好的做法。

票数 7
EN

Stack Overflow用户

发布于 2012-03-26 19:13:12

这是WCF中常见的问题,Dispose()经常抛出异常。有一种包装一次性的方法,这样您就可以继续获得the ()语句的好处,而不会导致异常丢失。它本质上吞噬了在Dispose过程中抛出的任何异常,因此原始异常总是抛出到更高上下文的异常。

http://marcgravell.blogspot.com/2008/11/dontdontuse-using.html

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9878216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档