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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM朱百青 中级黑马   /  2013-4-9 00:06  /  1763 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 HM朱百青 于 2013-4-9 22:46 编辑

int =1
public int Count()
{
   try
  {
    return  i;
  }
  finally
  {
     i+=1;
  }
}
这个的返回值是多少?  为什么??

评分

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

查看全部评分

17 个回复

倒序浏览
1. 返回值是2;
2。计数器函数内先执行finally{}语句内的语句,然后再执行try{}里面的语句,最后返回值是2。
回复 使用道具 举报
返回值为1;执行顺序:①执行try{}里的code,将结果保存在内存中未返回;②执行 finally {}里的 code;③返回try{}里的执行结果。
楼主可以亲测~~~
回复 使用道具 举报
我觉得是1,然后试验了下确实是1.
i=2,但是你return时此时此刻i=1。
定义时,楼主笔误:int i=1;
回复 使用道具 举报
  1.         static void Main(string[] args)
  2.         {
  3.             
  4.             Count();
  5.             Console.WriteLine(i);
  6.             Console.ReadKey();
  7.         }
  8.         static int i = 1;
  9.         public static int Count()
  10.         {

  11.             try
  12.             {
  13.                 return i;
  14.             }
  15.             finally
  16.             {
  17.                 i += 1;
  18.             }
  19.         }
复制代码
返回值为2
原因就是在一个try-finally语句中,finally语句总是在控制权离开try语句块时执行的。无论try语句是正常结束的,还是意外结束的。一条语句或一个语句块在它抛出了一个异常,或者对某个封闭型语句执行了一个break或continue,或是象这个程序一样在方法中执行了一个return时,将发生意外结束。它们之所以被称为意外结束,是因为它们阻止程序去按顺序执行下面的语句
回复 使用道具 举报
张正强 发表于 2013-4-9 08:14
返回值为1;执行顺序:①执行try{}里的code,将结果保存在内存中未返回;②执行 finally {}里的 code;③返 ...

对的!谢谢
回复 使用道具 举报
这个得对try  --catch --finally语法说明一下在其中try关键字是负责检查下面Code是否异常如果异常就转到catch执行下面code,
但不管是否异常finally里的代码在try catch  finally控制权移交之前都会得到执行,所以函数的返回值为2.
回复 使用道具 举报
本帖最后由 张振 于 2013-4-9 21:15 编辑

你这代码有问题  你的意思是要证明到底返回哪一个值 是finally 还是try  你的try里面写了return
而finally 里面没有return 所以你给的代码压根就不能证明你的问题   所以你的代码就算拿去验证 返回值也是为1
但你的finally中如果加了return又不能执行 因为finally是必须执行的 不管try能不能执行 但在finally中加入return去跳出的话就会报错 你可以试试 所以你的问题是有 但目前你给的代码却不能表达你想要的意思
回复 使用道具 举报
许庭洲 发表于 2013-4-9 06:14
1. 返回值是2;
2。计数器函数内先执行finally{}语句内的语句,然后再执行try{}里面的语句,最后返回值是2 ...

不对的哦  还是先执行try  在执行finally语句    其实这个函数的返回值还是1,这只不过是编译器帮我们玩了一个技巧而已
  1. public int Count()
  2. {
  3.     int CS$1$0000;
  4.     try
  5.     {
  6.         CS$1$0000 = this.i;
  7.     }
  8.     finally
  9.     {      
  10.         this.i++;
  11.     }
  12.     return CS$1$0000;
  13. }

复制代码
这是反编译后的程序   我理解了 谢谢你的回答  也希望你理解!
回复 使用道具 举报
许庭洲 发表于 2013-4-9 06:14
1. 返回值是2;
2。计数器函数内先执行finally{}语句内的语句,然后再执行try{}里面的语句,最后返回值是2 ...

不对的哦  还是先执行try  在执行finally语句    其实这个函数的返回值还是1,这只不过是编译器帮我们玩了一个技巧而已
  1. public int Count()
  2. {
  3.     int CS$1$0000;
  4.     try
  5.     {
  6.         CS$1$0000 = this.i;
  7.     }
  8.     finally
  9.     {      
  10.         this.i++;
  11.     }
  12.     return CS$1$0000;
  13. }

复制代码
这是反编译后的程序   我理解了 谢谢你的回答  也希望你理解!
回复 使用道具 举报
张振 发表于 2013-4-9 21:14
你这代码有问题  你的意思是要证明到底返回哪一个值 是finally 还是try  你的try里面写了return
而finally  ...

这个我写的有不详细的地方  不过这道题很明显证明的就是这个函数的返回值到底是多少!  由于代码是我在论坛手写,在定义变量的时候不小心拉掉了 i  !当然我们不能把return  放在finally里面 ,因为这样假设try中出现了问题,试问一个除了异常的函数怎么会有正常的返回值呢!我是这样认为的!至于这个问题已经解决了 谢谢你的回答
回复 使用道具 举报
郑丹丹1990 发表于 2013-4-9 08:16
我觉得是1,然后试验了下确实是1.
i=2,但是你return时此时此刻i=1。
定义时,楼主笔误:int i=1; ...

我手写的  是失误了点 呵呵  这个代码的反编译给你看看
public int Count()
{
    int CS$1$0000;
    try
    {
        CS$1$0000 = this.i;
    }
    finally
    {      
        this.i++;
    }
    return CS$1$0000;
}
回复 使用道具 举报
HM朱百青 发表于 2013-4-9 22:36
我手写的  是失误了点 呵呵  这个代码的反编译给你看看
public int Count()
{

试验了下确实是1????这是为何????????楼主!!!!!!!!!!!!!!!!
回复 使用道具 举报
郑丹丹1990 发表于 2013-4-10 07:55
试验了下确实是1????这是为何????????楼主!!!!!!!!!!!!!!!! ...

因为编译器在编译的时候,他会给我们生成一个字段int CS$1$0000;   而最后return的也是return CS$1$0000;所以结果当然还是1了!   
回复 使用道具 举报
HM朱百青 发表于 2013-4-10 10:00
因为编译器在编译的时候,他会给我们生成一个字段int CS$1$0000;   而最后return的也是return CS$1$0000; ...

有关反编译??俺半点也不知道?
回复 使用道具 举报
郑丹丹1990 发表于 2013-4-10 10:03
有关反编译??俺半点也不知道?

reflector    度娘一下吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马