12 ответов:
если у вас есть строка, и вы ожидаете, что она всегда будет целым числом (скажем, если какой-то веб-сервис передает вам целое число в строковом формате), вы бы использовали
Int32.Parse().если вы собираете входные данные от пользователя, вы обычно используете
Int32.TryParse(), так как это позволяет более точно контролировать ситуацию, когда пользователь вводит недопустимый ввод.
Convert.ToInt32()принимает объект в качестве аргумента. (См. ответ Криса S о том, как это работает)
Convert.ToInt32()и не бросаетArgumentNullExceptionкогда его аргумент равен нулю путьInt32.Parse()делает. Это также означает, чтоConvert.ToInt32()вероятно, немного медленнее, чемInt32.Parse(), хотя на практике, если вы не делаете очень большое количество итераций в цикле, вы никогда не заметите этого.
взгляните в отражатель:
int.Разбор("32"):
public static int Parse(string s) { return System.Number.ParseInt32(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo); }что требуется:
internal static unsafe int ParseInt32(string s, NumberStyles style, NumberFormatInfo info) { byte* stackBuffer = stackalloc byte[1 * 0x72]; NumberBuffer number = new NumberBuffer(stackBuffer); int num = 0; StringToNumber(s, style, ref number, info, false); if ((style & NumberStyles.AllowHexSpecifier) != NumberStyles.None) { if (!HexNumberToInt32(ref number, ref num)) { throw new OverflowException(Environment.GetResourceString("Overflow_Int32")); } return num; } if (!NumberToInt32(ref number, ref num)) { throw new OverflowException(Environment.GetResourceString("Overflow_Int32")); } return num; }преобразовать.ToInt32("32"):
public static int ToInt32(string value) { if (value == null) { return 0; } return int.Parse(value, CultureInfo.CurrentCulture); }как говорится в первом комментарии (Dave M).
без разницы как таковой.
Convert.ToInt32()звонкиint.Parse()внутрикроме одной вещи
Convert.ToInt32()возвращает0если аргументnullв противном случае оба работают одинаково
разница вот в чем:
Int32.Parse()иInt32.TryParse()можно только конвертировать строки.Convert.ToInt32()можно взять любой класс, реализующийIConvertible. Если вы передаете ему строку, то они эквивалентны, за исключением того, что вы получаете дополнительные накладные расходы для сравнения типа и т. д. Если вы конвертируете строки, тоTryParse()вероятно, это лучший вариант.
int.Метод Parse(строка s)
- Integer in RANGE > возвращает целочисленное значение
- нулевое значение > ArguementNullException
- не в формате > FormatException
- значение не в диапазоне > OverflowException
преобразовать.ToInt32(строка s)
- Integer in RANGE > возвращает целочисленное значение
- значение null > возвращает "0"
- не в формате > FormatException
- значение не в диапазоне > OverflowException
bool isParsed = int.TryParse (строка s,out res)
- Integer in RANGE > возвращает целочисленное значение, isParsed = true
- Null value > возвращает "0", isParsed = false
- не в формате > возвращает "0", isParsed = ложь
- значение не в диапазоне > возвращает "0", isParsed = false
попробуйте этот код ниже.....
class Program { static void Main(string[] args) { string strInt = "24532"; string strNull = null; string strWrongFrmt = "5.87"; string strAboveRange = "98765432123456"; int res; try { // int.Parse() - TEST res = int.Parse(strInt); // res = 24532 res = int.Parse(strNull); // System.ArgumentNullException res = int.Parse(strWrongFrmt); // System.FormatException res = int.Parse(strAboveRange); // System.OverflowException // Convert.ToInt32(string s) - TEST res = Convert.ToInt32(strInt); // res = 24532 res = Convert.ToInt32(strNull); // res = 0 res = Convert.ToInt32(strWrongFrmt); // System.FormatException res = Convert.ToInt32(strAboveRange); //System.OverflowException // int.TryParse(string s, out res) - Test bool isParsed; isParsed = int.TryParse(strInt, out res); // isParsed = true, res = 24532 isParsed = int.TryParse(strNull, out res); // isParsed = false, res = 0 isParsed = int.TryParse(strWrongFrmt, out res); // isParsed = false, res = 0 isParsed = int.TryParse(strAboveRange, out res); // isParsed = false, res = 0 } catch(Exception e) { Console.WriteLine("Check this.\n" + e.Message); } }
TryParse быстрее...
первая из этих функций, Parse, является той, которая должна быть знакома любой разработчик .Net. Эта функция примет строку и попытается извлеките из него целое число, а затем верните его. Если он работает в то, что он не может разобрать, то он бросает FormatException или если число слишком велико, исключение OverflowException. Кроме того, он может бросить ArgumentException, если вы передаете ему значение null.
TryParse это новое дополнение к новой платформе .Net 2.0, которое устраняет некоторые проблемы с исходной функцией синтаксического анализа. Основное разница в том, что обработка исключений очень медленная, поэтому если TryParse не удается разобрать строку он не вызывает исключение, как разбор делает. Вместо этого он возвращает логическое значение, указывающее, смог ли он успешно разобрать число. Так что вы должны пройти в TryParse оба строка, которая будет проанализирована и int32 параметры для заполнения. Мы будем используйте профилировщик для изучите разницу в скорости между TryParse и Синтаксический анализ в обоих случаях, когда строка может быть правильно проанализирована и в случаи, когда строка не может быть правильно проанализирована.
класс Convert содержит ряд функций для преобразования одного базового класса в другой. Я верю, что Конвертировать.ToInt32 (string) просто проверяет наличие нулевой строки (если строка имеет значение null, она возвращает ноль, в отличие от разбора), то просто звонки Типа int32.Разбор (строка). Я буду использовать профилировщик, чтобы подтвердить это и видеть если использование Convert в отличие от Parse имеет какой-либо реальный эффект на спектакль.
надеюсь, что это помогает.
типа int32.разбор (строка) - - ->
типа int32.Метод Parse (string s) преобразует строковое представление числа в его 32-разрядный целочисленный эквивалент со знаком. Если S является пустой ссылкой, он будет бросать исключение ArgumentNullException. Если s отличается от целочисленного значения, он будет вызывать FormatException. Когда s представляет собой число меньше, чем minvalue или больше, чем maxvalue, он будет бросать исключение overflowexception. для пример:
string s1 = "1234"; string s2 = "1234.65"; string s3 = null; string s4 = "123456789123456789123456789123456789123456789"; result = Int32.Parse(s1); //1234 result = Int32.Parse(s2); //FormatException result = Int32.Parse(s3); //ArgumentNullException result = Int32.Parse(s4); //OverflowExceptionпреобразовать.ToInt32(строка) --> Конвертировать.Метод ToInt32 (string s) преобразует указанное строковое представление 32-разрядного эквивалента целого числа со знаком. Это вызывает в свою очередь Int32.Метод Parse (). Когда s является нулевой ссылкой, он возвращает 0, а не бросает ArgumentNullException. Если s отличается от целочисленного значения, он будет вызывать FormatException. Когда s представляет собой число меньше, чем minvalue или больше, чем maxvalue, он будет бросать исключение OverflowException.
например:
result = Convert.ToInt32(s1); // 1234 result = Convert.ToInt32(s2); // FormatException result = Convert.ToInt32(s3); // 0 result = Convert.ToInt32(s4); // OverflowException
Convert.ToInt32в 19 перегрузок или 19 различных способов, которые вы можете назвать. Может быть, больше в версиях 2010 года.
он попытается преобразовать из следующих типов;
"Объект", Логическое Значение, Знак, Типа Sbyte, Байт, Типа INT16, Типа Uint16, Int32 И Тип Uint32, Типа Int64, Uint64 В, Один, Двойной, Десятичное Число, Строка, Дата
и он также имеет ряд других методов; один из них связан с базой чисел, а 2 метода включают
System.IFormatProviderParse с другой стороны имеет только 4 перегрузки или 4 различных способа вызова метода.
Integer.Parse( s As String) Integer.Parse( s As String, style As System.Globalization.NumberStyles ) Integer.Parse( s As String, provider As System.IFormatProvider ) Integer.Parse( s As String, style As System.Globalization.NumberStyles, provider As System.IFormatProvider )
Это зависит от типа параметра. Например, я только сегодня обнаружил, что он преобразует символ непосредственно в int, используя его значение ASCII. Не совсем та функциональность, которую я имел в виду...
ВЫ БЫЛИ ПРЕДУПРЕЖДЕНЫ!
public static int ToInt32(char value) { return (int)value; } Convert.ToInt32('1'); // Returns 49 int.Parse('1'); // Returns 1
преобразовать.ToInt32 допускает нулевое значение, он не выдает никаких ошибок Int.синтаксический анализ не позволяет значение null, он выдает ошибку ArgumentNullException.
для уточнения откройте консольное приложение, Просто скопируйте ниже код и вставьте его в
static void Main(string[] args)метод, я надеюсь, что вы можете понятьpublic class Program { static void Main(string[] args) { int result; bool status; string s1 = "12345"; Console.WriteLine("input1:12345"); string s2 = "1234.45"; Console.WriteLine("input2:1234.45"); string s3 = null; Console.WriteLine("input3:null"); string s4 = "1234567899012345677890123456789012345667890"; Console.WriteLine("input4:1234567899012345677890123456789012345667890"); string s5 = string.Empty; Console.WriteLine("input5:String.Empty"); Console.WriteLine(); Console.WriteLine("--------Int.Parse Methods Outputs-------------"); try { result = int.Parse(s1); Console.WriteLine("OutPut1:" + result); } catch (Exception ee) { Console.WriteLine("OutPut1:"+ee.Message); } try { result = int.Parse(s2); Console.WriteLine("OutPut2:" + result); } catch (Exception ee) { Console.WriteLine("OutPut2:" + ee.Message); } try { result = int.Parse(s3); Console.WriteLine("OutPut3:" + result); } catch (Exception ee) { Console.WriteLine("OutPut3:" + ee.Message); } try { result = int.Parse(s4); Console.WriteLine("OutPut4:" + result); } catch (Exception ee) { Console.WriteLine("OutPut4:" + ee.Message); } try { result = int.Parse(s5); Console.WriteLine("OutPut5:" + result); } catch (Exception ee) { Console.WriteLine("OutPut5:" + ee.Message); } Console.WriteLine(); Console.WriteLine("--------Convert.To.Int32 Method Outputs-------------"); try { result= Convert.ToInt32(s1); Console.WriteLine("OutPut1:" + result); } catch (Exception ee) { Console.WriteLine("OutPut1:" + ee.Message); } try { result = Convert.ToInt32(s2); Console.WriteLine("OutPut2:" + result); } catch (Exception ee) { Console.WriteLine("OutPut2:" + ee.Message); } try { result = Convert.ToInt32(s3); Console.WriteLine("OutPut3:" + result); } catch (Exception ee) { Console.WriteLine("OutPut3:" + ee.Message); } try { result = Convert.ToInt32(s4); Console.WriteLine("OutPut4:" + result); } catch (Exception ee) { Console.WriteLine("OutPut4:" + ee.Message); } try { result = Convert.ToInt32(s5); Console.WriteLine("OutPut5:" + result); } catch (Exception ee) { Console.WriteLine("OutPut5:" + ee.Message); } Console.WriteLine(); Console.WriteLine("--------TryParse Methods Outputs-------------"); try { status = int.TryParse(s1, out result); Console.WriteLine("OutPut1:" + result); } catch (Exception ee) { Console.WriteLine("OutPut1:" + ee.Message); } try { status = int.TryParse(s2, out result); Console.WriteLine("OutPut2:" + result); } catch (Exception ee) { Console.WriteLine("OutPut2:" + ee.Message); } try { status = int.TryParse(s3, out result); Console.WriteLine("OutPut3:" + result); } catch (Exception ee) { Console.WriteLine("OutPut3:" + ee.Message); } try { status = int.TryParse(s4, out result); Console.WriteLine("OutPut4:" + result); } catch (Exception ee) { Console.WriteLine("OutPut4:" + ee.Message); } try { status = int.TryParse(s5, out result); Console.WriteLine("OutPut5:" + result); } catch (Exception ee) { Console.WriteLine("OutPut5:" + ee.Message); } Console.Read(); } }
вот деталь для
int.ParseиConvert.ToInt32: Скажем, у вас есть массив символов,char[] a=['1','2','3','4']и хочу, чтобы преобразовать каждый элемент в целое число. ЭлементConvert.ToInt32(a[0])даст вам число 49. Он рассматривает его как код ASCII Элементint.Parse(a[0])даст вам правильный выход, который составляет 1если у вас есть массив строк
string[] b=['1','2','3','4'], потомConvert.ToInt32иint.Parseбудет иметь никакой разницы в выходе. Оба возвращают правое целое число.
Comments