C# 这两种可为null的类型之间有什么区别?

C# 这两种可为null的类型之间有什么区别?,c#,C#,这两者有什么区别 public Nullable<bool> val_a { get; set; } public bool? val_b { get; set; } public可空值{get;set;} 公共场所?val_b{get;set;} 它们都是可为空的类型 另外,如何测试val_b在一行中是否可以为null?bool?是可以为null的简写符号。它们是一样的 从: 任何可为null的值类型都是泛型System.nullable结构的实例。您可以使用以下任意可互换

这两者有什么区别

public Nullable<bool> val_a { get; set; } 
public bool? val_b { get; set; } 
public可空值{get;set;}
公共场所?val_b{get;set;}
它们都是可为空的类型


另外,如何测试val_b在一行中是否可以为null?

bool?
可以为null的简写符号。它们是一样的

从:

任何可为null的值类型都是泛型System.nullable结构的实例。您可以使用以下任意可互换形式引用具有底层类型T的可空值类型:可空或T

要测试
val\u b
是否为
null
,只需检查
val\u b.HasValue
。例如:

if (val_b.HasValue)
{
   var b = val_b.Value;
}
您还可以执行以下操作:

var b = val_b.GetValueOrDefault();

bool
的情况下,
默认值将为
false

要将
默认值
覆盖为
真值
,可以使用
GetValueOrDefault
重载:

var b = val_b.GetValueOrDefault(true);

这是一回事。就像使用
Int32
int
一样。没有区别

测试可为空的布尔值很简单,但有一个缺点

if(val_a)
if(!val_a)
这样的常见测试不起作用,因为可空布尔有三种状态:
true
false
null

这些方法之所以有效,是因为您正在进行显式比较:

if (val_a == true)
if (val_a == false)
if (val_a == null)
如果愿意,也可以使用null合并运算符,不过这对于其他可为null的类型更有用:

if (val_a ?? false)

查看是否要测试给定类型是否可为空。

如何安全地获取val_b的值?@MistyD,检查更新的回答@mjwills,很棒的建议,更新了我的答案。
另外,如何测试val_b是否可为空
您想知道它是
null
还是
可为空
?它们是两个完全不同的东西。这能回答你的问题吗?
if (val_a ?? false)