VB.NET中的Boolean和Nothing

13

让我们定义这个函数:

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

我希望它能够执行以下操作:

测试(True) -> "blabla1"

测试(False) -> "blabla0"

测试(无) -> "blabla"

问题在于 测试(无) 返回的是 "blabla0"。


使用布尔值来表示三个值是一个不好的想法。考虑更改该方法。 - Marvin Smit
2
我并不是要用它来处理三个值,我只是从数据库中获取了布尔值,我只是在处理拉取失败的情况。 - Arthur Rey
@Arty: 为了检查数据库结果中的空值,您可以检查该值(类型为 Object 而非 Boolean)是否为 DBNull,或使用 DataReader.IsDBNull 方法。 - Guffa
你正在考虑C#或Java中的null术语。在这种情况下,有三个值-True、False或Null(就像三态复选框)。然而,在Visual Basic中,Nothing的工作方式并非如此。在VB中,False在布尔上下文中等同于Nothing。同样,在字符串上下文中,String.Empty也等同于Nothing。这很令人困惑,但它不等同于C#或Java中的null。 - phn
3个回答

21

一个 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

9

Boolean是一个值类型,不是引用类型。因此,Boolean变量的值永远不可能为Nothing。如果将BooleanNothing进行比较,VB.NET首先将Nothing转换为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

注意,即使变量可以为null,你也不需要通过将其与 Nothing 进行比较来测试它是否为null。令人惊讶的是,Nullable(Of T) 也是值类型。因此,你应该使用它的 HasValue 属性,而不是测试它是否为 Nothing,正如我在示例中演示的那样。


Guffa的回答很好。我选择了这个答案,因为它更好地解释了在这种情况下“Nothing”的默认行为。 - Mike

3

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

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

值得注意的是,如果Nothing不是引用类型,则默认为默认值。如果您想这样做,可以将签名更改为期望Object而不是Boolean。

1
谢谢你的回答,但我更喜欢在不需要时避免强制转换。无论如何,已经点赞了 ;) - Arthur Rey
看到其他的解决方案,我并不怪你,它们更加简洁。 - Kogitsune

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接