Integer.Parse vs. CInt - PullRequest
       30

Integer.Parse vs. CInt

26 голосов
/ 08 января 2009

В основном, я использовал Integer.Parse и CInt в большинстве моих ежедневных задач по программированию, но меня немного смущает разница между этими двумя.

В чем разница между Integer.Parse и CInt в VB.NET?

Ответы [ 3 ]

30 голосов
/ 08 января 2009

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.

4 голосов
/ 08 января 2009

Глядя на 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

Вы видите, что внутри он вызывает Conversions.ParseDouble .

Поэтому, как уже объяснено в Binary Worrier, используйте Integer.Parse для приведения строк, а CInt только для приведения.

0 голосов
/ 08 января 2009

Методы <Data Type>.Parse используются для извлечения значения типа из строки, которая представляет значение (например, 2 из «2»). Функции C<Data Type> работают с выражениями и возвращают вариант, подтипированный к желаемому тип (например, CInt("2") ИЛИ CInt(SomeDouble + SomeDouble) и т. д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...