Estoy a favor de usar un parámetro de salida. En mi opinión, este es el tipo de situación para la cual el uso de los parámetros de salida es más adecuado.
Sí, puede usar el operador de fusión para mantener su código como un trazador de líneas si y solo si tiene un valor alternativo que puede usar en el resto de su código. A menudo me parece que no es el caso para mí, y preferiría ejecutar una ruta de código diferente de la que tendría si pudiera recuperar un valor.
int value;
if(DoSomethingWonderful(out value))
{
// continue on your merry way
}
else
{
// oops
Log("Unable to do something wonderful");
if (DoSomethingTerrible(out value))
{
// continue on your not-so-merry way
}
else
{
GiveUp();
}
}
Además, si el valor que quiero recuperar en realidad es anulable, a continuación, utilizando una función con un parámetro de salida y un valor de retorno booleano es, en mi opinión, la forma más fácil de decir la diferencia entre "yo no fue exitoso al recuperar el valor "y" El valor que recuperé es nulo ". A veces me importa esa distinción, como en el siguiente ejemplo:
private int? _Value;
private bool _ValueCanBeUsed = false;
public int? Value
{
get { return this._Value; }
set
{
this._Value = value;
this._ValueCanBeUsed = true;
}
}
public bool DoSomethingTerrible(out int? value)
{
if (this._ValueCanBeUsed)
{
value = this._Value;
// prevent others from using this value until it has been set again
this._ValueCanBeUsed = false;
return true;
}
else
{
value = null;
return false;
}
}
En mi opinión, la única razón por la mayoría de la gente tiende a no utilizar los parámetros de salida es porque encuentran la sintaxis engorroso. Sin embargo, realmente siento que el uso de parámetros de salida es la solución más adecuada para este problema, y descubrí que una vez que me acostumbré a él, encontré que la sintaxis es mucho más preferible que devolver un valor nulo.
Justo lo que iba a escribir. También significa que no necesita declarar una variable separada si no la necesita. Básicamente, permite más expresiones fluidas. –
¡GUAU! ¡Acabo de adelantar a Jon Skeet en una respuesta SO! ¡No podré dormir esta noche! – Manu
Esto es realmente bueno. Depende de cómo debe manejarse este nulo. Debido a que "también puede fallar" en la pregunta, asumí que es un error y no debería ser ignorado así. Si puede, este enfoque es definitivamente el mejor. –