int.Parse() от Convert.ToInt32()?




Никакой разницы как таковой.
Convert.ToInt32() вызывает внутренний вызов int.Parse()
За исключением одного, Convert.ToInt32() возвращает 0, когда аргумент - null.
В остальном оба работают одинаково
Да, Convert.ToInt32 (char) фактически вернет значение (int), которое превратит «1» в 49. Обычно это не так, как предполагалось.
Если у вас есть строка и вы ожидаете, что она всегда будет целым числом (скажем, если какая-то веб-служба передает вам целое число в строковом формате), вы должны использовать Int32.Parse().
Если вы собираете ввод от пользователя, вы обычно используете Int32.TryParse(), поскольку он позволяет более детально контролировать ситуацию, когда пользователь вводит недопустимые данные.
Convert.ToInt32() принимает объект в качестве аргумента. (См. Ответ Криса С., чтобы узнать, как это работает)
Convert.ToInt32() также не генерирует ArgumentNullException, когда его аргумент равен нулю, как это делает Int32.Parse(). Это также означает, что Convert.ToInt32(), вероятно, немного медленнее, чем Int32.Parse(), хотя на практике, если вы не выполняете очень большое количество итераций в цикле, вы никогда этого не заметите.
Как отмечают другие, Convert.ToInt32 (s) не генерирует исключение, когда s имеет значение null, но Parse () делает. «Немного медленнее» совершенно не относится к делу, так как вы никогда не заметите разницу.
Спасибо, Роберт! Я редактирую свой ответ для большей полноты. Но что касается производительности, готов поспорить, что разница в скорости будет заметна, если вы вызовете ее во вложенном цикле ...
Собственно, поскольку метод ToInt32 имеет перегрузку для нагрузок типов, в том числе System.String, время на определение типа не будет потеряно. Фактический код ничего не делает, кроме возврата 0 для нулевых значений и int.Parse(value, CultureInfo.CurrentCulture) для всего остального.
Где в документации сказано, что Convert.ToInt32 (s) не генерирует исключение, когда s имеет значение null? msdn.microsoft.com/en-us/library/sf1aw27b(v=vs.110).aspx
@StealthRabbi: В разделе документации «Возвращаемое значение»: «32-битовое целое число со знаком, эквивалентное числу в значении, или 0 (ноль), если значение равно нулю».
пожалуйста, удалите упоминание Int32.TryParse() из Convert.ToInt32(), потому что это неверно. Convert выдает исключение, если строка имеет неправильный формат.
Второй комментарий Дехалиона: «пожалуйста, удалите упоминание Int32.TryParse () в Convert.ToInt32 (), потому что это неверно»
@Dehalion Я никогда не говорил, что это не так, просто TryParse () вызывается внутри Convert.ToInt32 (). Я никогда не имел в виду, что эти функции имеют одинаковую функциональность. Отредактировано для ссылки на ответ Криса.
TryParse быстрее ...
The first of these functions, Parse, is one that should be familiar to any .Net developer. This function will take a string and attempt to extract an integer out of it and then return the integer. If it runs into something that it can’t parse then it throws a FormatException or if the number is too large an OverflowException. Also, it can throw an ArgumentException if you pass it a null value.
TryParse is a new addition to the new .Net 2.0 framework that addresses some issues with the original Parse function. The main difference is that exception handling is very slow, so if TryParse is unable to parse the string it does not throw an exception like Parse does. Instead, it returns a Boolean indicating if it was able to successfully parse a number. So you have to pass into TryParse both the string to be parsed and an Int32 out parameter to fill in. We will use the profiler to examine the speed difference between TryParse and Parse in both cases where the string can be correctly parsed and in cases where the string cannot be correctly parsed.
The Convert class contains a series of functions to convert one base class into another. I believe that Convert.ToInt32(string) just checks for a null string (if the string is null it returns zero unlike the Parse) then just calls Int32.Parse(string). I’ll use the profiler to confirm this and to see if using Convert as opposed to Parse has any real effect on performance.
Надеюсь это поможет.
Когда вы смотрите на исходный код из TryParse, в нем вообще нет обработки исключений - только манипуляции с символами и сдвиг битов, спасибо за ссылку
Разница вот в чем:
Int32.Parse() и Int32.TryParse() могут преобразовывать только строки. Convert.ToInt32() может принимать любой класс, реализующий IConvertible. Если вы передаете ему строку, они эквивалентны, за исключением того, что вы получаете дополнительные накладные расходы на сравнение типов и т. д. Если вы конвертируете строки, то TryParse(), вероятно, будет лучшим вариантом.
Посмотрите в отражатель:
int.Parse ("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;
}
Convert.ToInt32 ("32"):
public static int ToInt32(string value)
{
if (value == null)
{
return 0;
}
return int.Parse(value, CultureInfo.CurrentCulture);
}
Как говорится в первом комментарии (Дэйва М.).
Спасибо, что удалили все предположения из предыдущего ответа.
не должно ли это быть "return default (int);" ?
Короче говоря, Convert.ToInt32 возвращает 0, если null, чтобы int.Parse не поднял ArgumentNullException.
@ SkorunkaFrantišek - выражение default(int) оценивается во время компиляции, поскольку это внутреннее значение - результатом выражения является 0, поэтому компилятор вставляет литерал 0. Инструменты разборки IL не знают ничего лучше, поэтому они просто показывают вам буквальный ноль.
@antiduh: Вы правы, но с точки зрения защитного программирования я все же предпочел бы "default (int)". Что, если гипотетически значение default (int) изменится?
Это не может измениться - результат этого выражения жестко запрограммирован в двоичных файлах .net повсюду, и, вероятно, существует бесчисленное множество мест, где код проверяет значение, производное от default (int) (например, проверяет, не является ли переменная-член класса изменено с 0). Чтобы изменить значение default(int), необходимо перекомпилировать каждую каплю кода .Net в мире, иначе никакие программы не будут работать.
@ SkorunkaFrantišek Это совершенно не по делу. Пользователь копировал отраженный код. Изменять это было бы неверным представлением того, что скомпилировано. Если бы у пользователя был исходный источник, а исходный источник имел значение по умолчанию (int), то это то, что пользователь опубликовал бы.
@rshadman Правда, я не понял, что это код от Reflector.
Я немного опоздал, но значение default(int) невозможно изменить, поскольку выражение значения по умолчанию всегда возвращает ноль (т.е. все биты возвращаемой структуры равны нулю) для типов значений, включая определяемые пользователем структуры и null для ссылочных типов. Вы также можете безопасно вернуть false для логических значений, например, вместо default(bool). Было бы очень и очень странно представлять нулевое значение для числового типа с помощью ненулевых битов.
Почему этот основанный на фактах ответ не пользовался большей любовью с годами, для меня загадка, особенно учитывая, что он был написан в течение дня после принятого ответа.
Convert.ToInt32 допускает нулевое значение, он не вызывает никаких ошибок Int.parse не допускает нулевого значения, он выдает ошибку ArgumentNullException.
Convert.ToInt32
имеет 19 перегрузок или 19 различных способов, которые вы можете назвать. Может быть, больше в версиях 2010 года.
Он попытается преобразовать из следующих ТИПОВ;
Object, Boolean, Char, SByte, Byte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Decimal, String, Date
и у него также есть ряд других методов; один связан с числовой базой, а два метода связаны с System.IFormatProvider
Parse, с другой стороны, имеет только 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 )
для пояснения откройте консольное приложение, просто скопируйте приведенный ниже код и вставьте его в метод 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();
}
}
Это зависит от типа параметра. Например, я только что обнаружил сегодня, что он преобразует char напрямую в int, используя его значение ASCII. Не совсем та функциональность, которую я планировал ...
ВЫ БЫЛИ ПРЕДУПРЕЖДЕНЫ!
public static int ToInt32(char value)
{
return (int)value;
}
Convert.ToInt32('1'); // Returns 49
int.Parse('1'); // Returns 1
Может ли char неявно преобразовать string в C#? Это определенно возможно в VB.NET, и поэтому программисты, использующие этот язык, вероятно, ожидают, что Convert.ToInt32("1"c) и Convert.ToInt32("1") будут эквивалентными, но я не думаю, что C# имеет такое неявное преобразование.
Вы не можете преобразовать char в строку ни неявно, ни явно. Вам нужно будет вызвать '1'. ToString () или новую строку ('1', 1);
Я бы не стал считать это «предупреждение» чрезвычайно важным для C#, поскольку этот язык считает значения char немного более числовыми, чем vb.net. Опасность будет больше в vb.net, где из-за неявного приведения разница между Char и String меньше.
Int32.parse (строка) --->
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
Convert.ToInt32 (строка) -> Convert.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
добавить ссылку: codeproject.com/Articles/32885/…
Попробуйте этот код ниже .....
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);
}
}
ссылка: codeproject.com/Articles/32885/…
Вот детали для 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 не будут иметь разницы в выводе. Оба возвращают правильное целое число.
Методы Parse () предоставляют числовые стили, которые нельзя использовать для Convert (). Например:
int i;
bool b = int.TryParse( "123-",
System.Globalization.NumberStyles.AllowTrailingSign,
System.Globalization.CultureInfo.InvariantCulture,
out i);
будет анализировать числа с конечным знаком так, чтобы i == -123
Завершающий знак популярен в ERP-системах.
Точнее,
Convert.ToInt32(string)вызывает внутренний кодint.Parse.Convert.ToInt32(object), однако, вызывает((IConvertible) value).ToInt32, который в случаеstringназываетConvert.ToInt32(string)... немного запутанным ...