Доступ к значению, возвращенному функцией в блоке finally - PullRequest
11 голосов
/ 02 марта 2010

Я хотел бы знать, возможно ли получить возвращаемое значение функции внутри блока finally.

У меня есть такой код.

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

Я знаю, что это возможно, добавив переменную, которая может содержать возвращаемое значение. Но мне было интересно, можно ли каким-то образом получить значение.

Спасибо

Ответы [ 6 ]

27 голосов
/ 02 марта 2010

Нет, вы не можете этого сделать.

9 голосов
/ 02 марта 2010

Если вы хотите использовать переменный подход и вернуться раньше, вы можете сделать что-то вроде этого:

int Method()
{
    int @return = -1;
    try
    {
        @return = -2;
        return @return;
    }
    finally
    {
        // do something with @return
    }
}
9 голосов
/ 02 марта 2010
int value = -1;

try 
{ 
    value = 1; 
} 
finally 
{ 

    // Now the value is available
} 

return value;
8 голосов
/ 02 марта 2010

Как уже упоминалось, вы должны использовать переменную в этом случае. Однако вы можете обернуть этот шаблон поведения в метод многократного использования, используя лямбда-функции C # 3.0:

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
  });
4 голосов
/ 02 марта 2010

VB.Net позволяет вам сделать это:

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

Что немного говорит о том, что собирается делать JIT-компилятор.

0 голосов
/ 02 марта 2010

Я думаю, что реальный вопрос - могу ли я систематически отслеживать выход (и ввод?) Различных функций - предположительно для отслеживания / устранения неполадок и т. Д. Как насчет aspect.net. Это позволяет динамически вставлять код в вещи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...