2015-05-29 3 views
-1

Я читал книгу Fundamentals of Computer Programming with C#Какое значение возвращается в TryParse()?

string str = Console.ReadLine(); 
int Value; 
bool parseSuccess = Int32.TryParse(str, out Value); 
Console.WriteLine(parseSuccess ? "The square of the number is " + (Value * Value) + " . " : "Invalid number!"); 

Так что мой вопрос заключается в том, что в третьей строке bool parseSuccess = Int32.TryParse(str, out Value);Int32.TryParse() не будет ли он возвращать int значение? Как это может быть bool? И что именно означает ключевое слово out?

+0

Извините за форматирование Я не могу понять, как его форматировать, как код –

+1

true, если s было успешно преобразовано; в противном случае - false. https://msdn.microsoft.com/en-gb/library/f02979c7%28v=vs.110%29.aspx – fubo

+6

На языке программирования C# имеется полное руководство. Вы должны посмотреть на него, прежде чем задавать основные вопросы по синтаксису языка. См. [Руководство по программированию на C#] (https://msdn.microsoft.com/en-us/library/67ef8sbd.aspx). Подробную ссылку см. В [C# Reference] (http://msdn.microsoft.com/en-us/library/618ayhy6.aspx). –

ответ

6

Int32.TryParse возвращает логическое значение, чтобы показать, был ли синтаксический успешным или нет (если строка содержала не-цифровых символов, то преобразование потерпит неудачу).

out означает, что параметр передается по ссылке (это означает, что то, что передается функции TryParse, является адресом памяти вашей переменной).

+0

Как и в C++, мы не можем использовать оператор & для этого или это действительно необходимо использовать? Просто интересно –

+2

На другом языке, различный синтаксис, я думаю. – Nasreddine

+3

@IlayaRajaS C# фактически имеет два типа ссылочных параметров. Один указывается ключевым словом 'ref', а другой -' out'. Параметр out гарантируется компилятором, который определенно назначается вызываемым методом; переменная, переданная как параметр ref, требуется компилятору, чтобы быть определенно назначена перед вызовом метода. В C# оператор '&' разрешен только в небезопасном коде. – phoog

2

Как говорит метод TryParse, значит, он способен анализировать или нет, и это то, что указывает логическое значение.

Истина: успешно выполнена синтаксическая разборка, и анализируемое значение может быть извлечено из параметра param.

False: Невозможно разобрать значение строки в int. Вместо того, чтобы бросить любое исключение, он говорит вам, используя этот логический флаг, в этом случае вы можете использовать значение по умолчанию из PARAM (whihch 0) или назначить другое значение вашего выбора, как показано ниже:

int intValue = int.TryParse(stringValue, out intValue) ? intValue : myDefaultValue;//mydefaultValue is int containing value of your choice 

int.TryParse syntatic sugar

How the int.TryParse actually works

+1

Я не уверен, что вы подразумеваете под «вы можете использовать любое значение по умолчанию», но я подозреваю, что вы ошибаетесь. Если TryParse возвращает false, он установит параметр out равным нулю. Это, конечно, потому что для установки значения перед возвратом требуется метод, содержащий параметр out. Фактически, нет способа узнать, какое значение вы передали, потому что для записи в параметр перед тем, как читать из него, требуется метод, содержащий параметр out. – phoog

+0

@phoog согласен, отредактирован –

+0

Это намного яснее, спасибо. – phoog

2

Часть вашего вопроса, кажется:

Почему TryParse определяется как bool TryParse(string, out int) вместо int TryParse(string, out bool)?

Причина заключается в том, что выбранная подпись позволяет эту общую закономерность:

int x; 
if (int.TryParse(s, out x)) 
    Console.WriteLine(x); //or do whatever else 

С другой подписью, мы должны сделать это:

bool success; 
int x = int.TryParse(s, out success); 
if (success) 
    Console.WriteLine(x); // or do whatever else 

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

+0

@IlayaRajaS это не совсем правильно, потому что различные методы TryParse определены в разных типах. Поэтому они не перегружают друг друга. То есть 'bool TryParse (string value, out int result)' является статическим методом 'System.Int32', а' bool TryParse (строковое значение, out bool result) 'является статическим методом' System.Boolean'. – phoog

+0

Итак, ваш ответ правильный, без сомнения. Спасибо за разъяснения –

Смежные вопросы