某日在使用两者的时候产生了疑问
参考文章:
Java进阶知识点3:更优雅地关闭资源 - try-with-resource及其异常抑制
C#-using用法详解
相似之处:都是处理外部资源的语法糖,最后自动关闭资源
不同之处:下面使用它们的行为效果来简单解释不同之处,详细原理和编译器编译结果请参考以上两篇文章
- Java:try后括号中的AutoCloseable变量必须在此声明并初始化,且如果在初始化时候发生异常,那么它将会被接下来的catch块捕捉到,块中内容享受普通try块功能效果
- C#:using括号中的IDisposable变量可以此处或此前声明或初始化,using块不支持catch,不能再其之后紧接一个catch块,不过可以在最后关闭变量。
因此:
- Java的try括号中的异常可以在之后的catch块捕捉,其语法糖的finally关闭在自己的finally块前执行
- C#的using括号中的异常会抛到外部,需要使用try嵌套住using,除非你并没有捕捉的意思。其语法糖finally关闭也在你的外部try-catch-finally的finally块前执行