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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-金鑫 中级黑马   /  2012-9-7 17:04  /  1390 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马-金鑫 于 2012-9-8 09:19 编辑

Static void Main(string[] args)
{
     Console.WriteLine(Calc());
      Console.ReadKey();
}
Static int Calc()
{
      int i=0;
      try
      {
            return i;
      }
      finally
      {
            Console.WriteLine("finally");
            i++;
      }
}
答案:
finally
0


为什么上面先输出的是finally而不是0呢?不是应该先执行try{}里面的"return i;"后执行finally{}里的语句吗?

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

2 个回复

正序浏览
李 玉林 来自手机 中级黑马 2012-9-8 08:34:10
藤椅
try  catch  finally:这种结构,无论怎么样都会执行finally的语句块,这样你的问题就解决了,你掉用Calc方法时,只有执行完finally语句,程序才会返回调用处,这样就有了先打印finally后打印0的结果
回复 使用道具 举报
本帖最后由 黑马杨凯 于 2012-9-14 17:07 编辑

你说的没错就是先执行try{}里面的"return i;"后执行finally{}里的语句,但是return i 之后并没有去Console.WriteLine(i),而是将返回  值i,保存起来了,然后去执行finally程序段,也就是说finally{}执行完后才会返回return语句保存 的值,vs可以进行反汇编,看一下就很清楚他的工作了

总结:
          函数的return语句只出现在try-catch-finally 时,最终返回的值是return 语句中要返回的值(如果函数返回值为引用类型,return语句中变量当时指向的对象)。

          return只是起到一个标记保存要返回的值(或者具体对象)的作用,而不会跳转到ret进行返回,所以会先执行完finally{}程序体,再返回

我修改了这个程序,添加了两个方法,说明下返回值为引用类型的时候的情况,如下:
class Program
    {
        static void Main(string[] args)
         {
               Console.WriteLine(Calc());
               Console.WriteLine("GetStr()返回信息{0}",GetStr());  //1111
               Console.WriteLine("GetPerson()返回信息{0},{1}", GetPerson().Name, GetPerson().Age);//张三 23
               Console.ReadKey();
         }
         static int Calc()
         {
               int i=0;
               try
               {
                   return i;
               }
               finally
               {
                     Console.WriteLine("finally");
                     i++;
               }
         }

         static string GetStr()
         {
      
               string str = "1111";
               try
               {
                   return str;
               }
               finally
               {
                     str = "3333";
               }
         }

         static Person GetPerson()
         {
             Person p1 = new Person("张三", 23);
             try
             {
                 return p1;
             }
             finally
             {
                 Person p2 = new Person("李四", 25);
                 p1 = p2;
             }
         }
    }

    class Person
    {
        public Person()
        {
        }
        public Person(string name, int age)
        {
            Name = name;
            Age = age;
        }
        public string Name { get; set; }
        public int Age { get; set; }
    }

结果:
      

O6KOLP]2HWLCZEH9891)OM9.jpg (6.15 KB, 下载次数: 29)

O6KOLP]2HWLCZEH9891)OM9.jpg
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马