2012-04-28 28 views
7

¿Hay alguna forma de saber si un parámetro de salida ya se estableció o no? Este es el pseudocódigo para lo que estoy buscando:¿Cómo saber si ya se estableció un parámetro de salida?

public virtual string blabla(long num, out bool bval) 
    { 
     if (!bval.HasValue) 
      { 
      //Do some default logic 
      bval = defaultValue; 
      } 

     return blabla2(num, bval); 
    } 
+1

Si espera que algo venga en el método, no solo para salir, entonces use 'ref' en lugar de 'out'. –

+1

Parece que necesita un tipo que admite nulo: 'ref bool? bval' –

Respuesta

12

no se puede - no puede leer la variable hasta que haya sido definitivamente asignado dentro de su método. Debería considerarlo como una variable local, declarada pero sin asignar ningún valor al comienzo del método, pero que debe asignarle un valor antes de regresar. (Está bien que no ha asignado un valor a él si se produce una excepción.)

Si quieres un parámetro que lleva la información como entrada con el método, así como la propagación de la información, usted debe utilizar ref en lugar de out.

Consulte my article on parameter passing para obtener más información.

+0

Un parámetro de salida es más adecuado en mi caso. Pero solo estaba revisando para ver si hay alguna manera de verificar si se ha asignado un valor. Gracias de cualquier manera. – Omtara

+0

@Omtara: ¿A qué * exactamente * quiere decir con "si se le ha asignado un valor"? ¿Quiere decir fuera del método o dentro de su propio método? Si te refieres a tu propio método, podrías rastrearlo con una variable local 'bool' por ti mismo. Sin embargo, es extraño no saber exactamente dónde estás en el código en la mayoría de los lugares. –

+0

@Omtara: ¿cómo es que un parámetro out es más adecuado cuando en el comentario está diciendo que un método externo desde el que se llama al método actual usa el mismo parámetro out? –

2

Además de Jon's excelente respuesta, si desea que el parámetro a seguir siendo out, pero hay que ver si se ha asignado un valor en algún lugar en el interior el método, se podría utilizar un tipo anulable local, como sigue:

public virtual string blabla(long num, out bool bval) 
{ 
    bool? bvalLocal; 

    ... //I'm assuming there is some code here that may or 
     //may not assign bvalLocal? 

    // This whole if block may not be needed if the default 
    // value is the default for the type (i.e. false) as 
    // GetValueOrDefualt() will take care of that (see 
    // second to last line). 
    if (!bvalLocal.HasValue) 
    { 
     //Do some default logic 
     bvalLocal = defaultValue; 
    } 

    bval = bvalLocal.GetValueOrDefault(); 
    return blabla2(num, bval); 
} 
+0

El método que necesita verificar un parámetro de salida se llama desde otro método que usa el mismo parámetro de salida. Por lo tanto, usar una variable nullable local no funcionaría. – Omtara

+0

@Omtara - podría ser útil si publicó el código (o pseudocódigo) de las llamadas al método –

Cuestiones relacionadas