A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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 后跟函数 、操作数据或者跳转语句的的除外)请补充,谢谢!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

1 个回复

正序浏览
目前微软做的开发软件设计的C#语法除了以下风格外,还有类似的风格
try    {  
          ......
        }
finally {
           ......
       }   
类似的风格,虽然功能不同,但老外设计思想是一样的
if(...){......}   else{......}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马