一个老问题:try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

weiwolong 2010-10-27 01:22:54
下面是我的测试程序,测试结果为,在return之后执行final语句。
public class Test
{
public String Test1()
{
String str = "aa ";
try
{
str = "bb";
return str;
}
finally
{
str = "yy";
Console.WriteLine(str);
}
}
}
class Program
{
static void Main(string[] args)
{
Test te = new Test();
Console.WriteLine(te.Test1());
}
}

如果在final语句模块在return之前执行,那么输出应该是"yy","yy",但实际输出结果为"yy","bb"。也就是return先将"bb"返回,然后再执行的final模块,显示"yy",最后执行main函数中的语句,显示"bb".
...全文
2841 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujianlong 2010-10-27
  • 打赏
  • 举报
回复
Console.WriteLine(te.Test1());
执行顺序:1、te.Test1() 2、Console.WriteLine
te.Test1() 执行顺序,1、return 2、finally
让爱延续 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zaiduxinling 的回复:]
返回类型如果是 引用类型的 返回的是一个指向特定内存地址的指针、而一个指针就是一个整数,但是如果是值类型的返回的是确切的数据。

[/Quote]

这里面应该还有个 与参数和返回值相关的 拷贝问题,引用类型拷贝的是指针,值类型拷贝的是 数据。
让爱延续 2010-10-27
  • 打赏
  • 举报
回复

public class Test
{
public String Test1()
{
String str = "aa ";
try
{
str = "bb";
return str; // 0 此时执行了return 语句返回值已经确定了,但是该方法还没有执行完毕,
// 外界还不能访问返回值 或者说 还得不到返回值
}
finally
{ //1
str = "yy"; // 2
Console.WriteLine(str);// 3
} //4
} //5 到此方法执行完毕,外界才可以去访问此方法的返回值

}



还有返回类型如果是 引用类型的 返回的是一个指向特定内存地址的指针、而一个指针就是一个整数,但是如果是值类型的返回的是确切的数据。

在当前例子中,返回值是string值类型,第零步操作已经确定了返回值,第二步执行的操作 str = "yy"; 对外是不可以见的,因此方法体外得到的实际数据为:BB,但是如果返回值类型是引用类型则方法体外得到实际数据为 "yy".

自己的一点见解 不知对否、望大侠们莫笑。
changjiangzhibin 2010-10-27
  • 打赏
  • 举报
回复
一定会执行的
再见品月 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gxingmin 的回复:]

finally里的变量str不能改变之前的return里str值

除非你return语句在try catch finally后
[/Quote]
+1
让爱延续 2010-10-27
  • 打赏
  • 举报
回复
挺晕乎的一个问题
iey000 2010-10-27
  • 打赏
  • 举报
回复
finally ()是必须执行的
但是会在最后执行,打个必然你这个方法是string类型的,那等程序已经算出return的东西后,他将return的东西先在边上放一下(内存中暂时存一下),然后将finally放最后执行掉,这样整个方法已经完成,最终返回内存中暂存的东西
sweetqueen1 2010-10-27
  • 打赏
  • 举报
回复
自己调试就知道过程了、、
貌似无论执行try还是catch,都会执行finally,finally在return后会继续执行、、
自己网上搜也是一大堆、、、
兔子-顾问 2010-10-27
  • 打赏
  • 举报
回复
看书,看msdn,按F5。似乎都不应该发帖。
会执行。
Return门徒 2010-10-27
  • 打赏
  • 举报
回复
founderfang 2010-10-27
  • 打赏
  • 举报
回复
如果觉得不清楚就不要这样写程序,以后看的人也会有麻烦。
suners 2010-10-27
  • 打赏
  • 举报
回复
恩 小东西大作用
bancxc 2010-10-27
  • 打赏
  • 举报
回复
会.
return 前
自己debug下
gxingmin 2010-10-27
  • 打赏
  • 举报
回复
finally里的变量str不能改变之前的return里str值

除非你return语句在try catch finally后

110,580

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧