2010-03-01 14 views
10

Me gustaría saber si es posible obtener el valor de retorno de una función dentro de un bloque finally.Acceda al valor devuelto por una función en un bloque finally

Tengo un código que es así.

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

Sé que es posible mediante la adición de una variable que puede contener el valor devuelto. Pero me preguntaba si era posible obtener el valor de alguna manera.

Gracias

+1

utilizar la variable . hará su código más claro, más fácil de mantener, más fácil de entender. –

+1

Por curiosidad, ¿por qué querrías hacer eso? Tengo curiosidad por ver una situación en la que esa sería la solución ideal. –

+0

@Ian - Sí, rara vez hago más que limpieza en el bloque finally y eso es solo para malas API. – ChaosPandion

Respuesta

25

No, no puedes hacer eso.

+3

¿Qué más se puede decir? – ChaosPandion

+0

la respuesta de Tomas Petricek es correcta, simplemente usando el contenedor – Idan

9
int value = -1; 

try 
{ 
    value = 1; 
} 
finally 
{ 

    // Now the value is available 
} 

return value; 
+0

Sí, sé que es posible de esa manera. Me preguntaba si sería posible sin una variable. –

+0

de esta manera se pierden los beneficios de las devoluciones anticipadas :-( – Vlad

+0

Regreso anticipado? No estoy seguro de lo que quiere decir @Vlad. Eso es lo que el compilador desenrollará de todas maneras. ¿Está hablando desde el punto de vista del flujo visual? – GrayWizardx

8

Si desea utilizar el enfoque variable y volver a tiempo, usted podría hacer algo como esto:

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

O en forma más sucinta: 'return @return = -2;' –

+1

tengo que preguntar: ¿qué significa '@' en la fuente del nombre de la variable? – pm100

+0

y para Jeffrey comment return @return = -2. ¿Funcionaría eso? Lo que se hace primero, finalmente o la devolución – pm100

4

VB.Net le permite hacer esto:

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

Qué le dice un poco sobre lo que hará el compilador de JIT.

+1

Eso parece un poco peligroso. ¿No verificaría el GetValue en el bloque finally iniciar una llamada recursiva? – JohnFx

+2

No he usado VB.Net mucho, pero creo que los paréntesis son necesarios para hacer una llamada a función recursiva, por lo que debería ser seguro. –

+0

Esto no es recursivo. GetValue (el nombre de la función) es una variable disponible en vb.net. Observe que no hay declaración de devolución. Cuando el programa llega al final de la función, se devuelve GetValue (en este ejemplo, 2). – marr75

0

Creo que la pregunta real es: ¿puedo rastrear sistemáticamente la salida (y la entrada?) De varias funciones, presumiblemente para rastrear/solucionar problemas, etc. ¿Qué hay de aspect.net. Esto le permite insertar código dinámicamente en las cosas

+0

Bueno, no es realmente la pregunta. Estaba buscando esa parte solo para no tener que crear una función y configurarla antes de devolver el valor. El seguimiento es solo una pequeña parte del proyecto para ver el tiempo que tarda cada función (es un servicio web, por lo que queremos asegurarnos de que el rendimiento continúe). –

7

Como ya se ha mencionado, debe usar una variable en este caso. Sin embargo, se puede envolver este patrón de comportamiento en un método reutilizable usando C# 3.0 funciones lambda:

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

El método TryFinally le permite escribir lo que inicialmente sea necesario, sin repetir el patrón:

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

Eso no es tan malo. – ChaosPandion

Cuestiones relacionadas