【问题标题】:Integer.Parse vs. CIntInteger.Parse 与 CInt
【发布时间】:2010-09-30 05:51:30
【问题描述】:

基本上,我在大部分日常编程任务中都使用了Integer.ParseCInt,但我对两者之间的区别有点困惑。

VB.NET 中Integer.ParseCInt 有什么区别?

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    CIntInteger.Parse 做得更多。

    CInt 将首先检查传递的是否是整数,然后简单地转换并返回它。如果它是双精度数,它将尝试在不先将双精度数转换为字符串的情况下进行转换。

    请参阅CInt 和其他Type Conversion Functions 的帮助

    小数部分。当你转换一个 整数类型的非整数值, 整数转换函数 (CByte、CInt、CLng、CSByte、CShort、 CUInt、CULng 和 CUshort)删除 小数部分并将值四舍五入为 最接近的整数。

    如果小数部分正好是 0.5, 整数转换函数轮 它到最接近的偶数。为了 例如,0.5 轮到 0,以及 1.5 和 2.5 都舍入到 2。这有时称为庄家舍入,其 目的是补偿偏差 添加许多时可能会累积 这些数字加在一起。

    简而言之,它不仅仅是将字符串转换为整数,例如对分数应用特定的舍入规则,缩短不必要的转换等。

    如果您正在将字符串转换为整数,请使用Integer.Parse(或Integer.TryParse),如果您要强制转换未知值(例如来自数据库的variantobject)为整数,使用CInt

    【讨论】:

    • +1 但我个人更喜欢使用 DirectCastTryCast 将另一种类型强制(强制转换)为整数。我避免 CInt 正是因为它非常灵活,恕我直言,它掩盖了代码的意图。
    • @MarkJ:对不起,我认为你很困惑,DirectCastTryCast 都不会将字符串转换为整数,它们必须有继承关系才能工作。也许您正在考虑TryCast,它将使用与CInt相同的规则将对象强制为整数。
    • 我几乎一直在说,避免使用CInt。您写道“如果您要将字符串转换为整数,请使用*Parse”。同意。然后我建议,如果你是从整数类型开始(强制转换),只需使用*Cast。如果您真的不知道您是从整数类型还是字符串类型开始,请仅使用CInt。最后一种情况应该是非常罕见的——从某种弱类型的数据存储中获取变体或对象,这些数据存储以无纪律的方式使用>
    • @MarkJ:啊,我明白你从哪里来了。虽然像最后一种情况应该非常少见——从某种弱类型的数据存储中获取变体或对象,并且以不规范的方式使用,但这实际上取决于您所做的工作类型,以及您维护的代码库的年龄:)
    • @BinaryWorrier:无需退缩。 DirectCast 仅在对象和类型完全相同的情况下才有效,您不能将 int 转换为 long 或反之亦然,或者从 int 到/从十进制。 TryCast 不适用于值类型,因此您将收到 trycast(0D, integer) 的编译器错误。从 int 强制转换为其他值的唯一选择是 Cxxx 函数或 System.Convert 函数。
    【解决方案2】:

    使用ILDASM 查看一些示例代码,您可以看到 CInt 已转换为此调用:

    Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Conversions::ToInteger(string)

    使用.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 进行强制转换。

    【讨论】:

    • 文档似乎暗示编译器将根据调用方式以不同的方式处理 CInt 调用,并使用不同的类型作为参数。我很想看看当 Cint 传递一个 int、一个 long、一个 double 等时编译器会发出什么。我希望使用 int 的调用得到优化
    • 我尝试了带 Int、Long、Double 值的 CInt,在这种情况下,编译器会自动优化它的 IL 级别。
    • 这个答案说明了使用 ILDASM 而不是阅读文档的陷阱 :)
    • 如果事先声明 ILDASM 适用于传入值是字符串的情况,则此答案会更有用。你知道,我可以推断出来,但是下一位读者可能会发现这个答案令人困惑;)
    • 很高兴知道字符串的值是否为Nothing/null,它将返回零!
    【解决方案3】:

    这是一个真正的区别: Integer.parse("1.00") 会抛出错误。 CInt("1.00") 会起作用

    【讨论】:

      【解决方案4】:

      <Data Type>.Parse 方法用于从表示该值的字符串中提取该类型的值(例如,“2”中的 2)C<Data Type> 函数对表达式进行操作并返回一个变体子类型为所需类型(例如CInt("2")CInt(SomeDouble + SomeDouble)等)。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      相关资源
      最近更新 更多