【问题标题】:vb.net Boolean and Nothingvb.net 布尔值和无
【发布时间】:2013-11-24 17:58:40
【问题描述】:

让我们定义这个函数:

Public Function Test(ByVal value As Boolean)
    Return "blabla" + If(value = Nothing, "", If(value, "1", "0"))
End Function

我希望它执行以下操作: Test(True) -> "blabla1", Test(False) -> "blabla0", Test(Nothing) -> "blabla".

问题是Test(Nothing) 返回“blabla0”。

【问题讨论】:

  • 对 3 个值使用布尔值是个坏主意。考虑改变方法
  • 我不是说要把它用于 3 个值,我只是从数据库中获取布尔值,我只是在处理拉取失败的情况
  • @Arty:要检查数据库结果中的空值,请检查值(类型为Object,而不是Boolean)是否为DBNull,或使用DataReader.IsDBNull 方法。
  • 您正在考虑 C# 或 Java 的空术语。在这种情况下,存在三个值 - True、False 或 Null(如三态复选框)。然而这不是在 Visual Basic 中 Nothing 工作的方式。在 VB 中,False 在布尔值的上下文中是 Nothing。类似地,String.Empty 在字符串的上下文中是 Nothing。这很令人困惑,但它不等同于 C# 或 Java 中的 null。

标签: .net vb.net boolean nothing


【解决方案1】:

Boolean 值永远不能是 null (Nothing),可能的值是 TrueFalse。你需要一个可以为空的值,Boolean?,它才能为空。

使用可空值的HasValueValue属性检查是否有值,并获取值:

Public Function Test(ByVal value As Boolean?)
  Return "blabla" + If(Not value.HasValue, "", If(value.Value, "1", "0"))
End Function

【讨论】:

    【解决方案2】:

    Boolean 是值类型,而不是引用类型。因此,Boolean 变量的值永远不能是Nothing。如果将BooleanNothing 进行比较,VB.NET 首先将Nothing 转换为Boolean 的默认值False,然后将其与该值进行比较。因此,测试Boolean 变量Is Nothing 是否与测试它是否等于False 实际上相同。如果您需要可以设置为NothingBoolean,则需要将其设置为Nullable(Of Boolean)。不过,有一条捷径。要使任何值类型可以为空,您只需在类型后添加一个问号,如下所示:

    Public Function Test(ByVal value As Boolean?)
        Return "blabla" + If(value.HasValue, If(value.Value, "1", "0"), "")
    End Function
    

    您会注意到,即使变量可以为空,您仍然无法通过将其与Nothing 进行比较来测试它是否为空。这可能会让人感到意外,但Nullable(Of T) 实际上也是一个值类型。因此,与其测试它是否为Nothing,不如使用它的HasValue 属性,正如我在示例中演示的那样。

    【讨论】:

      【解决方案3】:

      在针对 Nothing 进行测试时,您需要使用 Is 关键字,但您无法将值作为布尔值传递,因为它仅适用于引用类型。

      If( value Is Nothing, "", If( value, "1", "0" ) )
      

      另外值得注意的是,Nothing如果不是引用类型,则默认为默认值。

      如果你想这样做,你可以改变你的签名以期望一个对象而不是布尔值。

      【讨论】:

      • Ty 的答案,但我更喜欢在不需要时避免强制转换。无论如何都赞成;)
      • 在看到其他解决方案之后 - 我不怪你,它们更干净。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多