如果我尝试将字符串放入布尔变量,例如:
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对我很喜欢,但我们应该使用哪个以及为什么?
答案 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