【问题标题】:How is a string value used as a boolean字符串值如何用作布尔值
【发布时间】:2015-04-24 13:55:32
【问题描述】:

当我意识到我可以将布尔值影响为字符串时,我正在使用 VB.NET (Visual Studio IDE) 中的代码

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

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

If StringValueContainingTrueOrFalse then 'Do Something End if

这也有效,并给出了预期的结果。这让我意识到我对后台的运作方式知之甚少。

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

发生了什么使这成为可能?

【问题讨论】:

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


    【解决方案1】:

    这不是 IDE 做的,而是做从一种类型到另一种类型的运行时转换。如果字符串包含一个可以转换为布尔值的值,那就没问题了。否则,您将收到运行时错误。

    我建议使用Option Strict On 来获取编译时错误,因此您不会无意中依赖您不知道的运行时转换。如果您打开此选项,您的问题中的代码将无法编译。

    【讨论】:

      【解决方案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 方法的调用。

      【讨论】:

      • 我接受了你的回答,因为它很好地解释了我想知道的“幕后”。但是,如果您可以像其他人一样将 Option Strict 添加到您的答案中,我觉得这将是一个更好的全面解释。感谢您的澄清
      • @micbobo 我不确定该选项的详细信息。老实说,我是一名 c# 开发人员。我相信未来的读者肯定也会阅读我们的 cmets 和其他答案。我不必在我的回答中重复它。顺便说一句,我不喜欢在我不完全理解的答案中添加内容。
      【解决方案3】:

      VB 在 If 块中需要一个布尔值,因此它会自动尝试使用隐式转换将您的表达式转换为布尔值。

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

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

      Option Strict On
      

      另请参阅 VB.Net If 语句的 MSDN 文档:

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

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

      【讨论】:

      • 您还可以使用整数 (0/1) 和位 (0/1) 值,它们可以正确转换为布尔值。
      【解决方案4】:

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

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

      结果:

      因此,为了回答您关于正在发生的事情的问题,正在发生“幕后”转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-07
        • 2014-03-30
        • 1970-01-01
        • 2011-02-17
        相关资源
        最近更新 更多