是否更好使用[类型] .Parse或C [Type]

时间:2011-12-13 16:19:46

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

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

    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对我很喜欢,但我们应该使用哪个以及为什么?

4 个答案:

答案 0 :(得分:5)

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

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

来自MSDN

  

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

关于Cbool(以及其他类似的方法)来自MSDN

  

这些函数是内联编译的,意味着转换代码是   评估表达式的部分代码。有时候没有   调用一个程序来完成转换,这会改进   性能。每个函数都将表达式强制转换为特定数据   型

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

您也可以查看: Integer.Parse vs. CInt

答案 1 :(得分:1)

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

如果您要将代码移植到C#或者知道您将只有真值/假值,那么Parse将是可行的方法。否则,我会使用CBool​​来增加灵活性。

答案 2 :(得分:0)

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

使用Bool.Parse(value),value应该是一个String,它将被解析为一个布尔值。

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

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

在VB.Net中使用Strict,您将被迫使用正确的类型。

所以,你不能这样做:

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

Dim r = v1 + v2

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

答案 3 :(得分:0)

这似乎表明,在string to boolean的情况下,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