关于.net技术问题

zxh5409 2019-10-10 03:06:45
Console.WriteLine(getb(1, 2));
static int getb(int a, int b)
{
try{
b = a + b;
Console.WriteLine(b);
return b;
}
finally{
b = 3 * b;
Console.WriteLine(b);
}
}

各位大神路过,帮忙请解,谢谢!
...全文
622 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

//这里会等到整个getb方法执行完返回值后输出
Console.WriteLine(getb(1, 2));



static int getb(int a, int b)
{
try{
    b = a + b;
//直接输出了这个没有异议吧?
    Console.WriteLine(b);
//return会离开try,因此激活了finally,finally结束前不做return操作,但是return的数据已经堆好了
    return b;
}
finally{
    b = 3 * b;
//顺序执行就输出了
    Console.WriteLine(b);
}
}


说到底如果你觉得输出有问题是因为你把return 放在了try里面,既然用try包裹输出就应该在try完成后再做return 正常来说应该这样写代码:


static int getb(int a, int b)
{
int c=0;
try{
    c = a + b;
    Console.WriteLine(c);
}
finally{
    c = 3 * c;
    Console.WriteLine(c);
}
return c;
}
这样就很清楚什么时候执行什么时候返回了。
慕容飘花 2019-10-16
  • 打赏
  • 举报
回复
我不太会c#,只会vb.net,但是基本上原理是一样的,应该是393
xiaoxiangqing 2019-10-15
  • 打赏
  • 举报
回复
finally无论如何都会执行
秋的红果实 2019-10-15
  • 打赏
  • 举报
回复
官网解释: By using a finally block, you can clean up any resources that are allocated in a try block, and you can run code even if an exception occurs in the try block. Typically, the statements of a finally block run when control leaves a try statement. The transfer of control can occur as a result of normal execution, of execution of a break, continue, goto, or return statement, or of propagation of an exception out of the try statement. 想了几天也没明白这个执行流程,今天了结下? 暂时解释为: finally block是清理现场的 是先return,然后执行的finally,见下面测试。 为什么先输出finally里的b(9),然后才输出函数getb返回值? 因为函数getb是个整体,需要都执行完(执行完finally)后才能输出返回值 测试代码

static int getb(int a, int b)
{
    try
    {
        b = a + b;
        Console.WriteLine(b.ToString()+" in try");
        Console.WriteLine(DateTime.Now);

        return b;
    }
    finally
    {
        Thread.Sleep(1000);
        Console.WriteLine(DateTime.Now);

        b = 3 * b;
        Console.WriteLine(b.ToString()+" in finally");
    }
}

结果: 输出到 17:36:54时,暂停了1秒,才输出的55 官方解释说得清楚:当离开try block时才启动finally block
  • 打赏
  • 举报
回复
有一种解释是在catch执行到return这句话前,b=3存到了栈里,然后执行finally,此时的b=9开出了另外一个临时空间,当执行完finally后,临时的b空间销毁,程序自动调用之前保存着的b=3这个栈空间,返回的结果也就是b=3,于是结果就是393
hello_android_lc 2019-10-15
  • 打赏
  • 举报
回复
引用 11 楼 wanghui0380 的回复:
哎,不纠结,不讨论。XX园之风不可涨。 作为理解执行顺序可以,打几个标识,观察一下。 但是“回”字之风不可涨,如果我在coderview时,看到这种神代码(包括 ++i++--这类)我会请你过来喝茶,请你解释一下你到底在何种无可替代的情况下写了这种神代码,如果解释不了,对不起,扣50块,周一清晨会议见
还有goto
luj_1768 2019-10-15
  • 打赏
  • 举报
回复
谁教你们这么写代码的?! 去骂那个人! 太缺德了!
briankyo82 2019-10-15
  • 打赏
  • 举报
回复
393,留名
雪狼孤竹 2019-10-15
  • 打赏
  • 举报
回复
3
9
3
OrdinaryCoder 2019-10-14
  • 打赏
  • 举报
回复
引用 10 楼 秋的红果实 的回复:
[quote=引用 9 楼 OrdinaryCoder 的回复:] [quote=引用 6 楼 秋的红果实 的回复:] 3 9 9
我放VS里跑一下是393[/quote]啊?b的作用域是整个函数体,已经变成9了,怎么能还是3?[/quote] 我放到VS里跑了一下 确实是这样
Dear200892 2019-10-12
  • 打赏
  • 举报
回复
先执行try里面的内容 输出a+b,也就是3 在return前执行finally内容 输出3*b,也就是9 最后输出return的结果,也就是a+b 最终输出结果:3 9 3
zxh5409 2019-10-12
  • 打赏
  • 举报
回复
问题是输出结果
秋的红果实 2019-10-12
  • 打赏
  • 举报
回复
3 9 9
wanghui0380 2019-10-12
  • 打赏
  • 举报
回复
哎,不纠结,不讨论。XX园之风不可涨。 作为理解执行顺序可以,打几个标识,观察一下。 但是“回”字之风不可涨,如果我在coderview时,看到这种神代码(包括 ++i++--这类)我会请你过来喝茶,请你解释一下你到底在何种无可替代的情况下写了这种神代码,如果解释不了,对不起,扣50块,周一清晨会议见
秋的红果实 2019-10-12
  • 打赏
  • 举报
回复
引用 9 楼 OrdinaryCoder 的回复:
[quote=引用 6 楼 秋的红果实 的回复:] 3 9 9
我放VS里跑一下是393[/quote]啊?b的作用域是整个函数体,已经变成9了,怎么能还是3?
OrdinaryCoder 2019-10-12
  • 打赏
  • 举报
回复
引用 6 楼 秋的红果实 的回复:
3 9 9
我放VS里跑一下是393
瀚娃娃 2019-10-11
  • 打赏
  • 举报
回复
问题是啥??
qzjsmile 2019-10-10
  • 打赏
  • 举报
回复
好厉害的样子
正怒月神 2019-10-10
  • 打赏
  • 举报
回复
问题是什么? finally会在return之前执行。
github_36000833 2019-10-10
  • 打赏
  • 举报
回复
在C#中,finally部分,会在离开try代码块的时候得到执行。 因此,try代码块返回3的时候,finally代码块得到执行,并打印9。
加载更多回复(1)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧