Я могу думать о двух хороших вариантов, если вы не готовы использовать параметр out
. Я должен сказать, однако, что из вашего вопроса, похоже, это лучший способ сделать это.
Есть только действительно две причины, я вообще вижу в избегая опробование модели, как это:
- когда асинхронные вызовы участвуют. Тестирование того, существует ли что-то в базе данных, например, и возвращает ее, если это так, не работает с параметром out.
- , когда вы что-то делаете свободно, например, в LINQ.
Кроме того, это прекрасная модель для использования, которая передает много информации, не жертвуя целостностью данных (или делая какие-либо предположения о том, что вы ожидаете).
Проблема здесь, и причина, по которой вы возвращаете bool
, как она есть сейчас, обрабатывает ошибки. Итак, вам нужно найти альтернативный способ обращения с ними.
Выбор здесь действительно зависит от того, какой вход вы ожидаете.
Используйте исключение:
Самый простой, наверное, просто не обращаться с ними. Пусть они распространяются. Если что-то не найдено или не разбирается, просто выбросьте исключение.
Использование исключений для направления регулярного потока приложений обычно считается плохой практикой, но может быть использовано для интерпретации того, что такое «обычный поток приложений». Поэтому обязательно посмотрите на свои данные и обстоятельства.
public static int GetParameter(this Dictionary<string, string> context, string parameterName)
{
string stringParameter = context[parameterName];
return int.Parse(stringParameter);
}
Использование нуль:
Если вы ждете исключения, чтобы быть более или менее общим местом, вы можете вернуть нуль, а просто установить свой контракт на использование null
когда-то незаконное происходит. Будьте осторожны, чтобы справиться с этим на стороне вызова, хотя!
Подобный этому подход используется для многих функций IndexOf
, как на string
. Они возвращают -1, а не null, но принцип тот же - одно значение, которое, как вы знаете, никогда не произойдет в реальных данных, и установите ваш контракт таким образом, чтобы это означало, что «это не сработало».
Это то, о чем я думал, когда раньше упоминал целостность данных и предположения. Что, если вы хотите вернуть это, словарь содержит пустую строку, и это должно означать нуль int. Внезапно вы больше не можете это передать. Так что да, это работает, но это решение, которое вы должны помнить. Убедитесь, что ваш «неудачный» случай никогда не будет результатом успешного прохождения.
public static int? GetParameter(this Dictionary<string, string> context, string parameterName)
{
string stringParameter;
if (!context.TryGetValue(parameterName, out stringParameter))
return null;
int ret;
if (!int.TryParse(stringParameter, out ret))
return null;
return ret;
}
Вернуться конкретный тип:
Это одна требует накладных расходов, но она имеет все любезность в качестве out
параметра, фактически не требует его.
Тем не менее, я не уверен, действительно ли мне это нравится или нет. Это здорово в том, что он дает вам, но для меня это очень тяжело для того, для чего вы его используете. Но в любом случае это есть другой вариант.
public class ParseResult
{
public ParseResult(bool IsSuccess, int Result)
{
this.IsSuccess = IsSuccess;
this.Result = Result;
}
public bool IsSuccess { get; set; }
public int Result { get; set; }
}
public static ParseResult GetParameter(this Dictionary<string, string> context, string parameterName)
{
int ret;
string stringParameter;
if (context.TryGetValue(parameterName, out stringParameter)
&& int.TryParse(stringParameter, out ret))
{
return new ParseResult(true, ret);
}
else
{
return new ParseResult(false, 0);
}
}
что вы пытаетесь вернуться, только целое число? делает ли результат «TryParse»? – Sayse
Джон, пожалуйста, добавьте код, который показывает, чего вы хотите достичь. – Dialecticus
Что бы вы вернули, если 'context' не содержит ключ' parameterName', или если значение для этого ключа не представляет допустимое целое число? – Corak