try{}finally{}与return合用的一些总结
先看一段小程序
class Program
{
static void Main(string[] args)
{
Console.WriteLine(getInt1());
Console.WriteLine(getInt2());
Console.ReadKey();
}
static int getInt1() {
int i = 3;
try {
i = i + 3;
return ++i;
}
finally {
i = i + 3;
Console.WriteLine("在getInt1()");
}
}
static int getInt2()
{
int i = 3;
try
{
i = i + 3;
return i++;
}
finally
{
i = i + 3;
Console.WriteLine("在getInt2()");
}
}
}
运行结果是:
在getInt1()
7
在getInt2()
6
下面是我对这段代码执行过程的分析和猜测,求证:
static int getInt1() {
int i = 3;
try {
i = i + 3;
/*
从返回的结果可以看出:
1、return 返回的是(++i)这个表达式的值
2、当程序执行到return的时候,该函数的最终返回值已经确定,不能再做修改,或者说修改无效
**/
return ++i;
}
finally {
i = i + 3;//这里的运算,虽然改变了i的值,但是对返回结果没有影响。
Console.WriteLine("在getInt1()");
}
return 3;//这里没有执行
/*
从这个方法可以推测出:
在try{}finally{}块中用return 关键字,运行顺序是这样的:
当程序执行到return 语句的时候,先确定返回值,然后跳出try{}模块,执行finally{}模块;
当执行完finally{}模块后,直接结束方法,不再执行以后的代码。
**/
}
static int getInt2()
{
//int a=0;
int i = 3;
try
{
i = i + 3;
return i++;// 这里换一种写法看得更明白一些:return a=i++;
}
finally
{
i = i + 3;
Console.WriteLine("在getInt2()");
}
}
就我以前所了解到的,程序执行完 return 语句后,函数结束。在try{}finally{}块中因为finally{}模块是一定要执行的,所以这是个例。
如果还有其他执行完return语句后程序还没结束的情况(return 后跟函数 、操作数据或者跳转语句的的除外)请补充,谢谢!
|