TryParse - это более продвинутая и мощная версия метода Parse ().

Разобрать ()

Метод Parse принимает строку в качестве аргумента и пытается преобразовать ее обратно в указанный тип. Вот как это выглядит в действии.

return Int32.Parse("101"); // Will return -> 101
return bool.Parse("true"); // Will return -> True
return bool.Parse(1); // Will fail since argument is not a string.

Проблема с методом Parse заключается в том, что если переданный ему аргумент недопустим, например bool.Parse(2), bool.Parse("asfsad"), Int32.Parse(null), он выдаст ошибку ArgumentNullException. Мы хотим, чтобы наша программа могла корректно обрабатывать неверный ввод, поэтому нам нужен более надежный метод, который не выдает ошибок при наличии неверных данных.

Введите метод TryParse.

TryParse ()

TryParse работает немного иначе. Он принимает ввод, как и раньше, и пытается его перевести, как и раньше. Но этот метод особенный, так как он возвращает два значения вместо обычного. Сам метод возвращает значение bool, если ему удалось успешно преобразовать аргумент в правильный формат.

Это означает, что мы можем проверить возвращаемое значение метода, чтобы убедиться, что перевод / синтаксический анализ прошел нормально. Вот как это выглядит: (пока игнорируйте второй параметр. Мы обсудим это через минуту.)

return Int32.TryParse("101", out int ignoreMeForNow); 
// Will return -> True
return bool.TryParse("true", out bool ignoreMeForNow);
// Will return -> True
return Int32.TryParse(null, out int ignoreMeForNow); 
// Will return -> False
return bool.TryParse("This is gibberish", out bool IgnoreMeForNow);
// Will return -> False

Здорово! Теперь мы узнали, что сам метод TryParse возвращает логическое значение. Но где я могу получить свою фактическую, переведенную стоимость?

Вы получаете его из переменной out.

Метод TryParse требует наличия параметра out, который содержит переведенное значение. Вы можете определить переменную над методом или внутри метода. Вы также можете игнорировать значение переменной out, если все, что вас волнует, - это использование метода TryParse для проверки логического значения, но вам все равно нужно правильно настроить переменную out.

Давайте посмотрим на несколько примеров.

// You can define your 'out' variable above the method call.
var outValue;
bool.TryParse("true", out outValue);
return outValue; // Will return -> true
// You can define the 'out' variable inside the method.
Int32.TryParse("123", out int value);
return value; // Will return -> 123
// You can ignore the 'out' variable and just check a boolean value.
return bool.TryParse(null, out bool ignoreThisVariable);
// Will return -> false
// Remember, this returns false since we're returning whether the TryParse method could translate the value it was given.

Если бы мы хотели использовать метод TryParse для проверки параметра конфигурации в нашем коде, возврата правильного утверждения true / false и обработки неверного ввода, это выглядело бы так.

function bool ReturnConfigSettingBool(string configSettingString)
{
  return bool.TryParse(configSettingString, out bool ignoreThis);
}

Помните о ложных срабатываниях

Вы должны знать, что в случае сбоя преобразования TryParse параметром out будет false. Вы должны проверить это и остерегаться этого.

function bool RetunConfigSettingBool(string configSettingString)
{
  var x = bool.TryParse(configSettingString, out bool boolValue);
  
  // Check 'x' to see if the conversion failed or not. If it failed,  we're going to default our bool value to true, just for this example.
  if(x == false) 
  {
    // Right now boolValue == false. We're resetting it.
    boolValue == true;
  }
 // return ...
}

Вот и все!

Помните,

  • Parse () возвращает переведенное значение или ошибку.
  • TryParse никогда не вернет ошибку.
  • TryParse возвращает 2 вещи. 1) логическое значение, указывающее, прошел ли перевод успешно или нет, и 2) переменная out переведенного значения.
  • Если TryParse не может преобразовать, он установит для параметра out значение false.

Передовой

Умный способ использовать метод TryParse - использовать тернарный оператор для создания условного выражения ссылки.

Допустим, вы хотели оценить параметр конфигурации, вернуть правильное утверждение true / false, предотвратить ошибки из-за неправильного ввода, и по умолчанию True в случае неправильного ввода, это будет выглядеть так.

public bool IsConfigSettingTrue(string configSettingString)
{
  return bool.TryParse(configSettingString, out bool ignoreThisVar) ? value : true;
}