【问题标题】:Is it Better to Use [Type].Parse or C[Type]使用 [Type].Parse 还是 C[Type] 更好
【发布时间】:2012-01-19 12:26:35
【问题描述】:

如果我尝试将字符串放入布尔变量中,例如:

    Dim testValue As String = "True"
    Dim bool1 As Boolean = testValue

Option Strict On 出现错误,建议的解决方法是将第二行更改为:

    Dim bool1 As Boolean = CBool(testValue)

这很好,但是 - 这样做的优点/缺点是什么:

    Dim bool1 As Boolean = Boolean.Parse(testValue)

CBool 对我来说很像 VB6,但我们应该使用哪个,为什么?

【问题讨论】:

    标签: .net vb.net performance types type-conversion


    【解决方案1】:

    这似乎表明在字符串转布尔的情况下,Boolean.Parse 要快得多。

        Dim t As String = "True"
        Dim f As String = "False"
        Const tries As Integer = 1000000
        Dim t_or_f As Boolean = True
        Dim stpw As New Stopwatch
    
        stpw.Restart()
        For x As Integer = 1 To tries
            t_or_f = CBool(f)
        Next
        stpw.Stop()
        Debug.WriteLine(stpw.Elapsed)
    
        stpw.Restart()
        For x As Integer = 1 To tries
            t_or_f = Boolean.Parse(f)
        Next
        stpw.Stop()
        Debug.WriteLine(stpw.Elapsed)
    

    当我看到这些类型的问题时,我不禁想知道程序员为什么/如何将一些数据直接转换为布尔值。我尽可能接受的是 1 = True 和 0 = False 的数值,但即便如此,您也会面临 .Net 以不同方式解释布尔值的事实。

        Dim t_or_f As Boolean = CBool(1)
        Debug.WriteLine(t_or_f.ToString & " " & CLng(t_or_f))
        t_or_f = CBool(0)
        Debug.WriteLine(t_or_f.ToString & " " & CLng(t_or_f))
    

    调试输出

    True -1
    False 0
    

    【讨论】:

    • 1) .Parse 在字符串上更快,但 CBool​​ 在布尔值上要快得多,而且做得更多。 2)如果您从文本文件中读取发生在布尔值上的一些值,情况如何?文本文件的编写可能超出您的控制范围。 3).Net 将 False 定义为零,将 True 定义为非零(默认为 -1),因此输出与我所说的一样。
    【解决方案2】:

    如果你知道它在这两种情况下都是一个字符串,它应该是一个等效的过程。因为 Cbool 最终会调用一个函数来转换它。 (只要你的值是“True”或“False”)

    如果您使用 cbool(value) 之类的东西并且该值是布尔值,则会有所不同。

    来自MSDN

    注意,只有要解析的字符串,解析操作才会成功 是“True”(TrueString 字段的值)或“False”( FalseString 字段)在不区分大小写的比较中。

    来自 MSDN 关于 Cbool(和其他类似的方法):

    这些函数是内联编译的,这意味着转换代码是 计算表达式的部分代码。有时没有 调用一个过程来完成转换,这提高了 表现。每个函数将表达式强制转换为特定数据 输入

    因此,如果您使用 cbool(value),如果您的值是布尔值,它只会使用它,不需要转换。这可能使其更高效。

    你也可以看看这个: Integer.Parse vs. CInt

    【讨论】:

      【解决方案3】:

      CBool​​(value) 是一个强制转换运算符,使用这种方法,value 应该是一个 Bool,但是 VB 会为你做一些转换。

      使用 Bool.Parse(value),value 应该是一个字符串,它会被解析为一个布尔值。

      您也可以使用 Convert.ToBoolean(value),它使用 .net 的转换方法来执行从一种类型到另一种类型的转换。

      在您的代码中,将空字符串转换为错误值是不正确的。这是可能的,但容易出错。

      在 VB.Net 中使用 Strict,你必须使用正确的类型。

      所以,你不能这样做:

      Dim v1 as String = "1"
      Dim v2 as Integer = 1
      
      Dim r = v1 + v2
      

      r 可以是 2 或 "11",这种错误很常见。

      【讨论】:

      • 这就是为什么应该使用Option Strict On,因为您的示例无法编译
      【解决方案4】:

      我认为最大的区别在于 Boolean.Parse 对它将接受的内容(真/假)非常严格,因为 CBool​​ 更宽松(0/1,真/假,我认为是/否,尽管我会必须重新测试)。

      如果您打算将代码移植到 C# 或知道您将永远只有真/假值,那么 Parse 将是您的最佳选择。否则,我会使用 CBool​​ 来增加灵活性。

      【讨论】:

        猜你喜欢
        • 2015-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-08
        • 1970-01-01
        • 1970-01-01
        • 2010-09-30
        相关资源
        最近更新 更多