TryParse () - почему этот код возвращает 0, а результат не должен быть -1?
См. следующий код:
string test = "";
int output = -1;
if (int.TryParse(test, out output))
{
Console.WriteLine("Parsed");
}
Console.WriteLine(output);
Когда TryParse()
терпит неудачу, не должен ли блок быть пропущен, Console.WriteLine("Parsed")
не вызывается и значение output
должно быть одинаковым (-1)?
Он возвращается 0
4 ответа:
Осуществление
TryParse
имеет по умолчанию параметрout
перед возвратом, иначе он не будет компилироваться - несмотря ни на что о том, инициализировали ли вы параметрout
с вызывающей стороны. Это относится к любому методу с параметрамиout
и не является специфичным дляTryParse
.Люди, которые его закодировали, выбралипо умолчанию параметр равен нулю , когда синтаксический анализ не удается.
Важно то, что вы не должны думать что любые методы параметров
out
будут сохранять исходное значение параметраout
при его передаче. На самом деле, он может никогда не выполнять параметр, так как компилятор сообщит:Использование неназначенного параметра out 'blah'
Если вы попытаетесь использовать значение параметра перед назначением ему внутри метода. Таким образом, вы можете гарантировать, что любое значение, которое вы назначаете и даете в качестве параметра
out
, будет проигнорировано / перезаписано.
Из MSDN:
Когда этот метод возвращает, содержит 32-разрядное целое число со знаком, эквивалентное числу, содержащемуся в строке, если преобразование удалось, или
zero
, если преобразование не удалось.
В случае неудачи он будет
return false
и код в операторе if не будет выполнен.В случае неудачи преобразования он также будет ретун
0
Вот почемуoutput=0
В C#,
Таким образом, Предыдущее значениеout
параметры должны быть назначены и не могут быть первоначально считаны. (При запуске метода параметрыout
обрабатываются как неинициализированные переменные.)output
не имеет значения. Он должен был быть перезаписан людьми, которые написали методTryParse
, иначе он не мог быть скомпилирован. В то же время методTryParse
не имеет доступа к предыдущему значениюoutput
. Поэтому нужно выбрать какую-то ценность. В этом деле, разработчики выбрали0
.