“bool”和“bool?”有什么区别?

我在C ++中使用了“bool”types的variables,并试图将我期望为布尔型的函数或属性的值放入我的variables中。 但是,我经常遇到结果types为“bool?”的情况 而不是“布尔”和隐式投射失败。

两者之间有什么区别,什么时候分别使用? 另外,我应该使用“布尔?” 作为我的variables的types? 这是最佳做法吗?

这个? 一个types后的符号只是一个Nullabletypes的快捷方式, bool? 相当于Nullable<bool>

bool是一个值types ,这意味着它不能为null ,所以Nullabletypes基本上允许你包装值types,并能够为它们分配null

bool? 可以包含三个不同的值: truefalsenull

另外,没有为bool?定义的短路运算符(&& ||) bool?

只有逻辑AND,包含OR的操作符才被定义,它们的行为如下所示:

 xyx & yx | y true true true true true false false true true null null true false true false true false false false false false null false null null true null true null false false null null null null null 

Nullabletypes基本上是一个通用结构,具有以下公共属性:

 public struct Nullable<T> where T: struct { public bool HasValue { get; } public T Value { get; } } 

HasValue属性指示当前对象是否有值,并且Value属性将获取对象的当前值,或者如果HasValue为false,则会引发InvalidOperationException。

现在你一定在想,Nullable是一个struct,一个不能为null的值types,为什么下面的语句是有效的呢?

 int? a = null; 

那个例子会编译成这样的:

 .locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0) IL_0000: ldloca.s V_0 IL_0002: initobj valuetype [mscorlib]System.Nullable`1<int32> 

对initobj的调用, 它将指定地址的值types的每个字段初始化为空引用或适当的基本types的0。

就是这样,这里发生的是默认的结构初始化 。

 int? a = null; 

相当于:

 Nullable<int> a = new Nullable<int>(); 

bool? 可以为空而bool不是。

 bool? first; bool second; 

在上面的代码中, first将是nullsecond将是false

一个典型的用法是如果你想知道是否有一个赋值给variables。 因为bool是一个值types (就像intlongdoubleDateTime和其他一些types一样),它总是被初始化为一个默认值(在bool情况下为false ,在int情况下为0 )。 这意味着你不能容易地知道它是否是false因为一些代码被赋予了false ,或者如果它是false因为它还没有被分配。 在这种情况下, bool? 派上用场。

每当你看到? 字符在types名称后面,它是Nullable<TypeName>的简写。 Nullable是一个特殊的types,允许值types的行为像一个空值。 这是一种明确expression值types的方法,可以有一个非值的值。

对于布尔它有效地变成一个三态值的variables

  • 与价值:真实
  • 价值:假
  • 没有价值

添加? 使types无效。 这意味着你可以这样做:

 bool? x = null; 

这将是完全OK。

布尔? 意味着布尔值是可以为null的,并且是一个结构体Nullable<bool>语法糖。 由于布尔值是一个值types,所以不能将其设置为null,但是在某些情况下,您希望在数据访问类中使用数据访问类,因为数据库字段可以具有空值。

bool只能包含truefalse值而bool? 也可以有一个null值。

另一个使用bool的好地方? 是在一个方法来添加空检查

 public bool? IsTurkeyStillInFridge(Turkey turkey) { if (turkey == null) return null; else if (fridge.Contains(turkey)) return true; else return false; } bool? canStayAtDesk = IsTurkeyStillInFridge(turkey); if (canStayAtDesk == null) MessageBox.Show("No turkey this year, check for ham."); else if (canStayAtDesk == true) MessageBox.Show("Turkey for lunch. Stay at desk."); else MessageBox.Show("Turkey's gone, go out to lunch."); 

布尔意味着你可以有真值和假值。 布尔? 意味着您可以具有true,false和null的值。

它适用于date时间和布尔值。