C# Web服务 - 先Return还是先Finally - 先发生什么

3
在C#.NET中,让我们以以下示例为例。
[WebMethod]
public int TakeAction()
{
    try {
        //Call method A
        Return 1;
    } catch (Exception e) {
        //Call method B
        Return 0;
    } finally {
        //Call method C
    }
}

现在假设方法C是一个长时间运行的过程。

在方法C被调用/完成之前或之后,调用TakeAction的客户端会收到返回值?

2个回答

11

首先对返回值进行评估,然后执行finally块,最后将控制权传回调用者(带有返回值)。如果finally块会改变返回值的表达式,则这种顺序非常重要。例如:

Console.WriteLine(Foo()); // This prints 10

...

static int Foo()
{
    int x = 10;
    try
    {
        return x;
    }
    finally
    {
        // This executes, but doesn't change the return value
        x = 20;
        // This executes before 10 is written to the console
        // by the caller.
        Console.WriteLine("Before Foo returns");
    }
}

此外,即使在 finally 块执行之前 Return 已经被 [评估],我的主要问题是找出调用者何时收到返回值/响应?是在 finally 执行之前还是之后? - adam
1
@adam:在 finally 块执行完毕后 - 这就是我所说的“控制权回传给调用方”的意思。这很容易检查 - 只需运行我展示的代码即可。它将在打印 10 之前打印“Before Foo returns”。 - Jon Skeet
当然可以,谢谢Jon!我想这对Web服务也是同样适用的,对吗? - adam
@adam:是的。这是语言的基本部分,无论用途如何都是一样的。 - Jon Skeet

2

finally块中的任何内容都会在离开try块后执行。在您的情况下,它将返回1或0,然后执行方法c。 有关try-catch-finally的更多信息,请参考此链接


返回1,然后执行方法C......这个帖子上的另一个答案是相反的......返回评估结果--最后执行--然后将控制权传回调用者......不确定该相信什么 =\ - adam
不,控制权在执行完方法C后才返回给调用者。这可能是你的意思,但从你的回答中并不清楚。 - Jon Skeet
2
如果不确定,就相信Jon Skeet。但是关键在于(这个答案没有明确说明),直到finally块执行完毕之后,控制权才会返回给调用者。 - Colin DeClue
是的。在执行方法c之后,控制权将返回,但返回值在try块中设置并且不会改变。如果我引导您走岔路,请接受我的道歉。 - fcmaine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接