Какой из них быстрее, мощнее и надежнее. И почему?
int.Parse()
int.TryParse()
Convert.ToInt32()
Какой из них быстрее, мощнее и надежнее. И почему?
int.Parse()
int.TryParse()
Convert.ToInt32()
Go прочитать это ( "Профили анализа производительности против TryParse vs. ConvertTo" ) для получения дополнительной информации.
Если вы не уверены в том, что строка является синтаксической, то int.TryParse()
будет намного быстрее, чем любая из других, и перехватывает исключения.
Convert.Int32()
вызывает Int32.Parse()
с дополнительной проверкой на null, , поэтому , поэтому Int32.Parse()
может быть чуть быстрее.Convert.Int32()
будет быстрее (он ловит нуль до Int32.Parse()
должен иметь дело с этим).
Int32.Parse()
вызывает Number.ParseInt32()
внутренне, который выдает исключения, когда число не может быть проанализировано.
Int32.TryParse()
вызывает Number.TryParseInt32()
внутренне, который имеет похожий код с Number.ParseInt32()
, но вместо того, чтобы бросать Исключения, он просто возвращает false... который вводит меньше накладных расходов.
Учитывая все эти переменные, я предполагаю, что Int32.TryParse()
даст вам самые быстрые результаты для ненулевых значений. Если есть вероятность, что большинство вызовов могут содержать нули, я бы сказал, что Convert.Int32()
будет работать лучше.
... все, что приносит вам сила .NET Reflector.
Я лично использую
int.Parse(...)
если у меня есть строка в качестве источника и
Convert.ToInt32(...)
если у меня есть значениеType (double, decimal) в качестве источника, потому что в противном случае мне пришлось отнести его к строкам и обработать локальную культуру.
Оба int.Parse
и Convert.Int32
внутренне вызывают int.TryParse
, поэтому различия в производительности между ними должны быть тривиальными. TryParse
является наиболее универсальным в том смысле, что он позволяет вам решить, нужно ли генерировать исключение, но в противном случае нет никакой разницы между этими методами.
Convert.ToInt32 (string) вызывает Int32.Parse(строка).
Однако, если вы используете Int32.Parse(или эквивалентный int.Parse), вы можете указать глобализацию и форматирование, используемые при разборе.
Int.Parse будет быстрее, поскольку он не выполняет попытку /catch.
Int.TryParse более надежный и не будет вызывать ошибку, если вы не передадите ему неконвертируемое значение.
Я считаю, что ответ зависит от контекста.
Если я конвертирую (например) a DataRow
в объект, у меня будет много вызовов Convert.ToXXX
, поэтому я бы использовал Convert.ToInt32
, потому что это согласуется с другими утверждениями вокруг этого преобразования.
В других ситуациях, если я хочу генерировать исключение, когда строка не анализируется (быстродействующая), я буду использовать int.Parse
, потому что это вызывает для меня исключение, а int.TryParse
имеет тенденцию генерировать более уродливый код (Я никогда не был фанатом параметров)
И если я просто хочу указать какое-то значение по умолчанию, если строка не анализируется, я буду использовать int.TryParse
, потому что в противном случае мне придется обрабатывать исключение самостоятельно, и это дорого и уродливо.
Однако, если вы не вызываете сайт разбора раз в несколько раз, я был бы удивлен, увидев заметную разницу во времени между любым из трех форматов, поэтому я предпочел бы более читаемый фрагмент кода в более малом варианте.