В основном, я использовал как Integer.Parse
, так и CInt в большинстве своих ежедневных задач программирования, но я немного смущен от того, какая разница между ними.
В чем разница между Integer.Parse
и CInt
в VB.NET?
В основном, я использовал как Integer.Parse
, так и CInt в большинстве своих ежедневных задач программирования, но я немного смущен от того, какая разница между ними.
В чем разница между Integer.Parse
и CInt
в VB.NET?
CInt
делает намного больше, чем Integer.Parse
.
CInt
сначала проверяет, является ли то, что было передано, целое число, а затем просто бросает его и возвращает. Если он будет двойным, он попытается преобразовать его, не преобразовывая дважды в строку.
См. это из справки для CInt
и других Функции преобразования типов
Дробные части. Когда вы конвертируете неинтегральное значение интегральному типу, целочисленные функции преобразования (CByte, CInt, CLng, CSByte, CShort, CUInt, CULng и CUShort) удалите дробная часть и округлить значение до ближайшего целого числа.
Если дробная часть равна 0,5, функции целочисленного преобразования это до ближайшего четного целого. Для например, 0,5 раунда до 0 и 1,5 и 2.5 оба раунда до 2. Это иногда называют округлением банкира, а его Цель состоит в том, чтобы компенсировать смещение которые могут накапливаться при добавлении многих такие числа вместе.
Короче говоря, он делает гораздо больше, чем преобразование строки в целое число, например. применение определенных правил округления к фракциям, короткое обращение ненужных преобразований и т.д.
Если то, что вы делаете, преобразует строку в целое число, используйте Integer.Parse
(или Integer.TryParse
), если вы принудительно вводите неизвестное значение (например, variant
или object
из базы данных) в целое число, используйте CInt
.
Глядя на ILDASM на каком-то примерном коде, вы можете видеть, что CInt преобразуется в этот вызов:
Microsoft.VisualBasic] Microsoft.VisualBasic.CompilerServices.Conversions:: ToInteger (строка)
Используя .NET Reflector, вы можете извлечь этот фрагмент кода:
Public Shared Function ToInteger(ByVal Value As String) As Integer
Dim num As Integer
If (Value Is Nothing) Then
Return 0
End If
Try
Dim num2 As Long
If Utils.IsHexOrOctValue(Value, (num2)) Then
Return CInt(num2)
End If
num = CInt(Math.Round(Conversions.ParseDouble(Value)))
Catch exception As FormatException
Throw New InvalidCastException(Utils.GetResourceString("InvalidCast_FromStringTo", New String() { Strings.Left(Value, &H20), "Integer" }), exception)
End Try
Return num
End Function
Вы можете видеть, что внутри он вызывает Конверсии .ParseDouble.
Поэтому, как уже объяснялось Binary Worrier, используйте Integer.Parse для принудительного ввода строк и CInt только для кастинга.
Методы <Data Type>.Parse
используются для извлечения значения типа из строки, которая представляет значение (например, 2 из "2" ). Функции C<Data Type>
работают с выражениями и возвращают вариант, вводимый в соответствии с желаемым (например, CInt("2")
OR CInt(SomeDouble + SomeDouble)
и т.д.).