vb.net布尔值与零

vb.net布尔值与零,.net,vb.net,boolean,nothing,.net,Vb.net,Boolean,Nothing,让我们定义这个函数: 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)->“blablabla” 问题是,Test(Nothing)返回“blabla0”。

让我们定义这个函数:

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)->“blablabla”


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

在对Nothing进行测试时,需要使用is关键字,但无法将值作为布尔值传递,因为它只对引用类型有效

If( value Is Nothing, "", If( value, "1", "0" ) )
还值得注意的是,如果不是引用类型,则默认值不为默认值


如果您想这样做,您可以更改签名以期望对象而不是布尔值。

布尔值决不能为
null
),可能的值为
。您需要一个可为null的值,一个
布尔值?
,它才能为null

使用可空值的
HasValue
Value
属性检查是否存在值,并获取值:

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

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

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)
实际上也是一种值类型。因此,与其测试它是否为
Nothing
,不如使用它的
HasValue
属性,正如我在示例中演示的那样。

对3个值使用布尔值是个坏主意。考虑改变MeoDoI并不意味着使用它3个值,我只是从数据库中获得布尔值,我只是处理拉拽的情况。failed@Arty:要从数据库结果中检查空值,请检查值(类型为
对象
,而不是
布尔值
)是否为
DBNull
,或者使用
DataReader.IsDBNull
方法。您正在考虑C#或Java的空术语。在该上下文中有三个值-True、False或Null(类似于三态复选框)。然而,在VisualBasic中,任何东西都不是这样工作的。在VB中,False在布尔值的上下文中为Nothing。类似地,String.Empty在字符串的上下文中也不是什么。这很令人困惑,但答案并不等同于C#或Java.Ty中的null,但我更喜欢在不需要时避免强制转换。无论如何,投票结果都是上升的;)在看到其他解决方案后——我不怪你,它们更干净。