.net 如何将字符串值用作布尔值
我在VB.NET(Visual Studio IDE)中玩代码时,意识到我可以将布尔值转换成字符串 因此字符串的值为“True”或“False” 然后我尝试将其用作布尔值,例如.net 如何将字符串值用作布尔值,.net,vb.net,string,visual-studio,boolean,.net,Vb.net,String,Visual Studio,Boolean,我在VB.NET(Visual Studio IDE)中玩代码时,意识到我可以将布尔值转换成字符串 因此字符串的值为“True”或“False” 然后我尝试将其用作布尔值,例如 如果StringValueContainingTrue或False,则 “做点什么 如果 这也起到了作用,并取得了预期的效果。这让我意识到,我对背景中的工作原理知之甚少 是否检测到字符串中的单词True,IDE是否足够聪明来处理它,或者它只是尝试将值转换为它需要的值(因此知道它需要一个布尔值,尝试将字符串转换为一个值来执
如果StringValueContainingTrue或False,则
“做点什么
如果
这也起到了作用,并取得了预期的效果。这让我意识到,我对背景中的工作原理知之甚少
是否检测到字符串中的单词True,IDE是否足够聪明来处理它,或者它只是尝试将值转换为它需要的值(因此知道它需要一个布尔值,尝试将字符串转换为一个值来执行其操作)
发生了什么使这成为可能?VB希望If块中有一个布尔值,因此它会自动尝试使用隐式转换将表达式转换为布尔值 布尔类型转换识别真/假字符串并正确解析它们 这通常被认为是有风险的。尝试添加
Option Strict On
另请参见VB.Net If语句的MSDN文档:
所需条件。表情。必须评估为真或假,或
隐式转换为布尔值的数据类型
不是IDE在做,而是在从一种类型转换到另一种类型。如果字符串包含一个可以转换为布尔值的值,则可以。否则,您将得到一个运行时错误
我建议改为使用
选项Strict On
来获取编译时错误,这样您就不会无意中依赖于您不知道的运行时强制转换。如果启用此选项,问题中的代码将无法编译。当在If语句中使用非布尔表达式时,Vb.Net编译器将使用方法将表达式转换为布尔表达式
您的代码等于
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
方法的调用。当字符串直接用于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
结果:
因此,为了回答你关于正在发生什么的问题,有一个“幕后”的转换正在发生
您还可以使用整数(0/1)和位(0/1)值,这些值可以正确转换为布尔值。我接受了您的回答,因为它很好地解释了我想知道的“幕后”问题。然而,如果你能像其他人一样在你的答案中添加选项Strict,我觉得这将是一个更好的全面解释。谢谢你的邀请clarifications@micbobo我不知道该选项的细节。老实说,我是一名c#开发者。我相信未来的读者一定会阅读我们的评论和其他答案。我不必在回答中重复它。顺便说一句,我不喜欢在我的答案中添加我不完全理解的内容。