2013-10-23 57 views
3

在C#.NET會發生什麼,讓我們來看看下面的例子C#Web服務 - 返回然後最後 - 第一

[WebMethod] 
public int TakeAction() 
{ 
    try { 
     //Call method A 
     Return 1; 
    } catch (Exception e) { 
     //Call method B 
     Return 0; 
    } finally { 
     //Call method C 
    } 
} 

現在讓我們假設方法C是一個長期運行的進程。

調用TakeAction的客戶端在調用方法C之前還是在調用/完成之後取回返回值?

回答

10

返回值是先評估然後執行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"); 
    } 
} 
+0

此外,即使返回是[評估]在finally塊之前......我的主要問題是要找出調用者接收回來的點回報/迴應?終於執行之前或之後? – adam

+1

@adam:finally塊執行後 - 這就是我所說的「控制權傳遞給調用者」。檢查這一點很容易 - 只需運行我所展示的代碼即可。在打印10之前它將打印「Before Foo return」。 –

+0

當然可以,謝謝Jon!我預計這對於Web服務的工作方式是一樣的嗎? – adam

2

finally塊中的任何內容在離開try塊後執行。在你的情況下,它返回1或0,然後執行方法c。 欲瞭解更多關於try-catch-finally的信息,你可以參考this

+0

返回1,然後執行方法C .....在這篇文章上的其他答案是相反的.....返回評估 - 最後執行 - 然後,控制傳回給調用者.....不知道什麼相信= \ – adam

+0

不,控制器會在*方法C之後返回到調用者*。這可能是您的意思,但您的答案並不明確。 –

+2

@adam:如果有疑問,請相信Jon Skeet。但是關鍵字(在這個答案中沒有明確說明)是直到執行finally塊之後,控制纔會返回給調用者。 –

相關問題