黑马程序员技术交流社区

标题: 一道面试题,求指教。 [打印本页]

作者: 黑马-金鑫    时间: 2012-9-7 17:04
标题: 一道面试题,求指教。
本帖最后由 黑马-金鑫 于 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{}里的语句吗?
作者: 黑马杨凯    时间: 2012-9-8 00:29
本帖最后由 黑马杨凯 于 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

作者: 李 玉林    时间: 2012-9-8 08:34
try  catch  finally:这种结构,无论怎么样都会执行finally的语句块,这样你的问题就解决了,你掉用Calc方法时,只有执行完finally语句,程序才会返回调用处,这样就有了先打印finally后打印0的结果




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2