我想知道是否可以在finally塊中獲取函數的返回值。在finally塊中訪問函數返回的值
我有一些這樣的代碼。
try
{
return 1;
}
finally
{
//Get the value 1
}
我知道這可以通過添加一個可以保存返回值的變量來實現。但我想知道是否有可能以任何方式獲得價值。
感謝
我想知道是否可以在finally塊中獲取函數的返回值。在finally塊中訪問函數返回的值
我有一些這樣的代碼。
try
{
return 1;
}
finally
{
//Get the value 1
}
我知道這可以通過添加一個可以保存返回值的變量來實現。但我想知道是否有可能以任何方式獲得價值。
感謝
不,你不能這樣做。
還能說什麼? – ChaosPandion 2010-03-01 21:33:47
Tomas Petricek的答案是正確的 - 只需使用包裝 – Idan 2015-05-31 16:36:07
int value = -1;
try
{
value = 1;
}
finally
{
// Now the value is available
}
return value;
是的,我知道這是可能的。我只是想知道如果沒有變量是可能的。 – 2010-03-01 21:35:56
這樣就失去了早期回報的好處:-( – Vlad 2010-03-01 21:36:08
早期回報?不知道你的意思是@Vlad,這是編譯器將語言無論如何展開的有效方式,你是從視覺流的角度來談論的 – GrayWizardx 2010-03-01 21:37:36
如果你想使用變量的方法和提前返回,你可以做這樣的事情:
int Method()
{
int @return = -1;
try
{
@return = -2;
return @return;
}
finally
{
// do something with @return
}
}
VB.Net可以讓你做到這一點:
Public Function GetValue() As Integer
Try
GetValue = 2
Catch
'Something happens
Finally
'Do something with GetValue
End Try
End Function
哪告訴你一些關於JIT編譯器將要做什麼的信息。
我認爲實際的問題是 - 我可以系統地跟蹤各種功能的退出(和輸入?) - 大概是用於跟蹤/故障排除等。aspect.net如何?這可以讓你動態地在代碼中插入代碼
嗯,這不是真正的問題。我只是在尋找那部分,不必創建一個函數並在返回值之前進行設置。跟蹤是唯一的項目看到,每個功能所花費的時間的一小部分(這是一個Web服務,所以我們要確保性能仍然存在)。 – 2010-03-01 21:58:36
正如其他人已經提到的,在這種情況下你必須使用一個變量。但是,您可以使用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
});
這並不算太壞。 – ChaosPandion 2010-03-01 22:20:02
使用變量。它會讓你的代碼更清晰,更容易維護,更易於理解。 – 2010-03-01 21:35:37
爲了好奇,你爲什麼要這麼做?我很好奇看到一種情況,那就是理想的解決方案。 – 2010-03-01 21:37:18
@Ian - 是的,我很少在finally塊中做更多的清理工作,這只是對於糟糕的API。 – ChaosPandion 2010-03-01 21:39:06