2010-03-01 25 views
10

我想知道是否可以在finally塊中獲取函數的返回值。在finally塊中訪問函數返回的值

我有一些這樣的代碼。

try 
{ 
    return 1; 
} 
finally 
{ 
    //Get the value 1 
} 

我知道這可以通過添加一個可以保存返回值的變量來實現。但我想知道是否有可能以任何方式獲得價值。

感謝

+1

使用變量。它會讓你的代碼更清晰,更容易維護,更易於理解。 – 2010-03-01 21:35:37

+1

爲了好奇,你爲什麼要這麼做?我很好奇看到一種情況,那就是理想的解決方案。 – 2010-03-01 21:37:18

+0

@Ian - 是的,我很少在finally塊中做更多的清理工作,這只是對於糟糕的API。 – ChaosPandion 2010-03-01 21:39:06

回答

25

不,你不能這樣做。

+3

還能說什麼? – ChaosPandion 2010-03-01 21:33:47

+0

Tomas Petricek的答案是正確的 - 只需使用包裝 – Idan 2015-05-31 16:36:07

9
int value = -1; 

try 
{ 
    value = 1; 
} 
finally 
{ 

    // Now the value is available 
} 

return value; 
+0

是的,我知道這是可能的。我只是想知道如果沒有變量是可能的。 – 2010-03-01 21:35:56

+0

這樣就失去了早期回報的好處:-( – Vlad 2010-03-01 21:36:08

+0

早期回報?不知道你的意思是@Vlad,這是編譯器將語言無論如何展開的有效方式,你是從視覺流的角度來談論的 – GrayWizardx 2010-03-01 21:37:36

8

如果你想使用變量的方法和提前返回,你可以做這樣的事情:

int Method() 
{ 
    int @return = -1; 
    try 
    { 
     @return = -2; 
     return @return; 
    } 
    finally 
    { 
     // do something with @return 
    } 
} 
+5

或者更簡潔地說:'@返回返回= -2;' – 2010-03-01 21:48:06

+1

我要問 - 什麼變量名的字體是「@」是什麼意思? – pm100 2010-03-01 21:51:12

+0

和Jeffrey評論return @return = -2。那工作?這能夠完成第一,最後或@ PM100返回 – pm100 2010-03-01 21:52:50

4

VB.Net可以讓你做到這一點:

Public Function GetValue() As Integer 
    Try 
     GetValue = 2 
    Catch 
     'Something happens 
    Finally 
     'Do something with GetValue 
    End Try 
End Function 

哪告訴你一些關於JIT編譯器將要做什麼的信息。

+1

這似乎有點危險。不會檢查finally塊中的GetValue是否啓動遞歸調用? – JohnFx 2010-03-01 22:04:16

+2

我沒有使用VB.Net非常多,但我認爲括號都需要做一個遞歸函數調用,所以這應該是安全的。 – 2010-03-01 22:15:57

+0

這不是遞歸的。 GetValue(函數名稱)是vb.net中的可用變量。注意沒有Return語句。當程序到達該函數的結尾時,返回GetValue(在本例中爲2)。 – marr75 2010-03-02 14:13:57

0

我認爲實際的問題是 - 我可以系統地跟蹤各種功能的退出(和輸入?) - 大概是用於跟蹤/故障排除等。aspect.net如何?這可以讓你動態地在代碼中插入代碼

+0

嗯,這不是真正的問題。我只是在尋找那部分,不必創建一個函數並在返回值之前進行設置。跟蹤是唯一的項目看到,每個功能所花費的時間的一小部分(這是一個Web服務,所以我們要確保性能仍然存在)。 – 2010-03-01 21:58:36

7

正如其他人已經提到的,在這種情況下你必須使用一個變量。但是,您可以使用C#3.0的lambda函數包裝這個行爲模式爲可重複使用的方法:

static T TryFinally<T>(Func<T> body, Action<T> finallyHandler) { 
    T result = default(T); 
    try { 
    result = body(); 
    } finally { 
    finallyHandler(result); 
    } 
    return result; 
} 

TryFinally方法允許你寫你原來需要什麼,而無需重複模式:

TryFinally(() => { 
    // body of the method 
    return 1; 
    }, result => { 
    // do whatever you need with 'result' here 
    }); 
+1

這並不算太壞。 – ChaosPandion 2010-03-01 22:20:02

相關問題