废话就不多讲了,直接看看下面的例子。 1)static int Test() { int val = 1; try { return val; } finally { val = 2; } } 2)static int s_val; static int Test() { s_val = 1; try { return s_val; } finally { s_val = 2; } } 请问这两个例子最后的 return value 是什么? 我们仔细看看这两个了例子就知道2)与1)的不同在于前者使用静态变量代替局部变量。那么他们之间有什么不同么? 答案是他们的return value 是一样的,都是1。 便于讲解,我们拿出他们的IL代码看看:
posted on 2008-03-05 11:45 gjcn 阅读(1704) 评论(17) 编辑 收藏 所属分类: Net Framework
sf 回复 引用 查看
这个返回结果跟使用什么变量有关系吗?我觉得此处要提起注意的是finally语句造成的结果而不是方法的返回值吧 回复 引用 查看
无事找事吧 回复 引用
@Anders Cui 对,是看造成的结果,但是要通过方法的返回值才可以看到造成的结果 回复 引用 查看
Then what happens to reference type?FileStream fs=null;try{fs = new FileStream(@"c:\aaa.txt"....);}finally{fs.Dispose();} 回复 引用 查看
不错。 回复 引用 查看
@guest 现在的确比较闲,但是通过这些研究我们才能更好的了解NET嘛。个人兴趣而已 回复 引用 查看
不错的例子,讲解少了点,呵呵 回复 引用 查看
should it be try { return val; } finally { return 2; } 回复 引用
@volnet(可以叫我大V) 是少了点,现在刚开始写这种文章,可能还不怎么会。 其实我想讲讲很多net底层的东西,但是由于时间和表达水平的问题一直没写。 回复 引用 查看
我顶 回复 引用
学习了,没试过从这个层面去分析问题。 有时间说说引用类型的情况。 回复 引用
@acai 请问想了解引用类型的什么情况? 看看我能帮你解决的? 回复 引用 查看
@gjcn "这里无论是那种方式,都是生成一个隐藏变量存储返回值的,并不是直接返回变量的地址的。" ----由你这句话想到的。值类型可以这样,引用类型不可以吧。 回复 引用
@acai 引用类型也是一样,CLR将一个方法分配到线程堆栈都是一样的。。 实参 局部变量 返回地址 因此这里无论是那种方式,就要看你当时return的地址。 回复 引用 查看
static StringBuilder Test() { StringBuilder strb = new StringBuilder("A"); try { return strb.Append("B"); } finally { strb.Append("C"); } } 这里返回的是ABC了,因为这里返回的是一个对象的引用,其实这里该对象已经给改变了。 假如把StringBuilder 改为string,那么就会是 static String Test() { StringBuilder strb = new StringBuilder("A"); try { return strb.Append("B").ToString(); } finally { strb.Append("C"); } } 这是就是AB了,因为String类型是固定空间的不可更改的类型,它的每一次表面上的更改是返回一个新的String对象。 回复 引用
恩 不错 顶一个 在一个trycatchfinally块中,return前finally块中的代码是一定会执行的 回复 引用 查看