Нашелся прикльный примерчик где использование goto выглядит как минимум не хуже альтернативного варианта.
Вопросов два:
1. Какой вариант вам нравится больше?
2. Можно предложить какой-то другой варинат который был бы лучше чем два предложенных?
Производительность имеет значение, так что вариант на класса/лямбдах/дополнительных функциях/использующий лишние проверки не принимается (не приветствуется).
Вариант с goto:
void AddResult(int startPos, int endPos, int startState, int stackLevel, RecoveryStackFrame stackFrame, string text, int fail)
{
_bestResultsCount++;
if (_bestResult == null) goto good;
if (endPos > _bestResult.EndPos) goto good;
if (endPos < _bestResult.EndPos) return;
if (startPos < _bestResult.StartPos) goto good;
if (startPos > _bestResult.StartPos) return;
if (stackLevel < _bestResult.StackLevel) goto good;
if (stackLevel > _bestResult.StackLevel) return;
if (startState < _bestResult.StartState) goto good;
return;
good:
_bestResult = new RecoveryResult(startPos, endPos, startState, stackLevel, stackFrame, text, fail);
}
Вариант без goto:
void AddResult(int startPos, int endPos, int startState, int stackLevel, RecoveryStackFrame stackFrame, string text, int fail)
{
_bestResultsCount++;
if (this._bestResult != null)
{
if (endPos <= this._bestResult.EndPos)
{
if (endPos < this._bestResult.EndPos)
return;
if (startPos >= this._bestResult.StartPos)
{
if (startPos > this._bestResult.StartPos)
return;
if (stackLevel >= this._bestResult.StackLevel)
{
if (stackLevel > this._bestResult.StackLevel)
return;
if (startState >= this._bestResult.StartState)
return;
}
}
}
}
_bestResult = new RecoveryResult(startPos, endPos, startState, stackLevel, stackFrame, text, fail);
}