Я за использование выходного параметра. На мой взгляд, это та ситуация, для которой использование выходных параметров наиболее подходит.
Да, вы можете использовать оператор coalesce, чтобы сохранить ваш код в виде однострочного кода, если и только если у вас есть альтернативное значение, которое вы можете использовать в оставшейся части кода. Я часто нахожу, что это не так, и я предпочел бы выполнить другой путь кода, чем если бы я был в состоянии успешно получить значение.
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();
}
}
Кроме того, если значение, которое я хочу получить, на самом деле обнуляется, то использование функции с выходным параметром и логическим возвращаемым значением, по моему мнению, является самым простым способом определить разницу между «Мне не удалось получить значение "и" полученное значение равно нулю ". Иногда меня волнует это различие, например, в следующем примере:
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;
}
}
По моему мнению, единственная причина, по которой большинство людей склонны не использовать выходные параметры, заключается в том, что они считают синтаксис громоздким. Тем не менее, я действительно чувствую, что использование выходных параметров является более подходящим решением этой проблемы, и я обнаружил, что, привыкнув к нему, я нашел синтаксис гораздо более предпочтительным, чем возвращение нулевого значения.