如何将字符串值用作布尔值

时间:2015-04-24 13:55:33

标签: .net vb.net string visual-studio boolean

当我意识到我可以将一个布尔值影响到一个字符串

时,我正在玩VB.NET(Visual Studio IDE)中的代码。

该字符串因此取值“True”或“False”

然后我尝试将它用作布尔值,例如

If StringValueContainingTrueOrFalse then 'Do Something End if

这也起作用并且给出了期望的结果。这让我意识到我对后台的工作方式知之甚少。

字符串中的 True 是否被检测到并且IDE足够智能处理它,或者它只是尝试将值转换为它需要的值(因此知道它需要它)一个布尔值尝试将字符串转换为一个来执行它的操作)?

这是怎么回事?

4 个答案:

答案 0 :(得分:3)

它不是IDE在做它,而是它从一种类型到另一种类型进行运行时转换。如果字符串包含可以强制转换为布尔值的值,那么你很好。如果没有,您将收到运行时错误。

我建议使用Option Strict On代替编译时错误,这样您就不会无意中依赖于您不知道的运行时转换。如果启用此选项,则问题中的代码将无法编译。

答案 1 :(得分:2)

VB期望If块中有一个布尔值,因此它会自动尝试使用隐式转换将表达式转换为布尔值。

布尔转换识别真/假字符串并正确解析它们。

这通常被认为是有风险的。尝试添加

    $UserName = Read-Host "Username"
    $DisplayName = Get-Aduser $Username | Select-Object Name | Format-Table -HideTableHeaders | Out-String

另请参阅VB.Net的MSDN文档。如果声明:

https://msdn.microsoft.com/en-us/library/752y8abs.aspx

  

条件必需。表达。必须评估为真或假,或者   一种可隐式转换为布尔值的数据类型。

答案 2 :(得分:2)

当在IF语句中使用非布尔表达式时,Vb.Net编译器将使用Conversions.ToBoolean方法将表达式转换为布尔值。

您的代码等于

If Conversions.ToBoolean(StringValueContainingTrueOrFalse) then
    'Do Something
End if

如果您的值可以转换为布尔值,那么一切都很好。否则将抛出异常。

例如:

Sub Main
    Dim StringValueContainingTrueOrFalse as String = "True"

    IF StringValueContainingTrueOrFalse then
    Console.WriteLine("true")
    end if  
End Sub

以上程序生成以下IL:

IL_0000:  ldstr       "True"
IL_0005:  stloc.0     // StringValueContainingTrueOrFalse
IL_0006:  ldloc.0     // StringValueContainingTrueOrFalse
IL_0007:  call        Microsoft.VisualBasic.CompilerServices.Conversions.ToBoolean
IL_000C:  brfalse.s   IL_0018
IL_000E:  ldstr       "true"
IL_0013:  call        System.Console.WriteLine
IL_0018:  ret

您可以看到标签IL_0007显示对Conversions.ToBoolean方法的调用。

答案 3 :(得分:1)

当在if语句中直接使用String时,它会尝试将其转换为布尔值,以便执行评估。 "真"或"错误"可以转换为布尔值,但其他值不能。

Module Module1
    Sub Main()
            Dim StringValueContainingTrueOrFalse As String = "True"
        If StringValueContainingTrueOrFalse Then
            Console.WriteLine(StringValueContainingTrueOrFalse)
        End If

        Console.ReadLine()
    End Sub
End Module

结果:

enter image description here

所以要回答你关于发生了什么的问题,有一个"在幕后"转换正在发生。

enter image description here