59

我对变量使用“bool”类型,就像我在 C++ 中习惯的那样,我尝试将我希望为布尔值的函数或属性的值放入我的变量中。但是我经常遇到结果类型为“bool”的情况。而不是“布尔”,隐式转换失败。

两者有什么区别,分别在什么时候使用?另外,我应该使用“bool”吗?作为我的变量的类型?这是最佳做法吗?

4

9 回答 9

95

类型后面的?符号只是Nullable 类型的快捷方式,bool?相当于Nullable<bool>.

bool值类型,这意味着它不能是null,所以 Nullable 类型基本上允许您包装值类型,并能够分配null给它们。

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

此外,没有为bool?

仅定义了逻辑 AND(包括 OR)运算符,它们的行为如下:

x        y      x & y   x | 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

Nullable 类型基本上是一个泛型结构,具有以下公共属性:

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

HasValue属性表示当前对象是否有值,该Value属性会获取该对象的当前值,如果HasValue为false则抛出InvalidOperationException。

现在你一定很疑惑,Nullable是一个struct,一个不能为null的值类型,那么为什么下面的语句是有效的呢?

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的调用,它将指定地址处的值类型的每个字段初始化为空引用或相应原始类型的 0。

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

int? a = null;

相当于:

Nullable<int> a = new Nullable<int>();
于 2009-07-25T07:35:50.770 回答
16

bool?可以为空,而bool不是。

bool? first;
bool second;

在上面的代码中,firstwill be nullwhile secondwill be false

一种典型的用途是,如果您想知道是否对变量进行了赋值。由于bool是一个值类型(就像int, long,doubleDateTime其他一些类型一样),它总是会被初始化为一个默认值(false在 a 的情况下bool0在 an 的情况下int)。这意味着您无法轻易知道是false因为分配了某些代码false,还是false因为尚未分配。这种情况下bool?就派上用场了。

于 2009-07-25T07:36:25.277 回答
6

每当你看到 ? 类型名称后面的字符,它是 . 的简写Nullable<TypeName>。Nullable 是一种特殊类型,它允许值类型像空值一样工作。这是一种显式表达值类型的方式,可以具有非值值。

对于 bool 它有效地将变量转换为三态值

  • 有值:真
  • 带值:假
  • 没有价值
于 2009-07-25T07:37:32.857 回答
4

添加?使类型可以为空。这意味着您可以这样做:

bool? x = null;

这完全没问题。

于 2009-07-25T18:41:41.663 回答
3

布尔?表示布尔值可以为空,并且是 stucture 的语法糖Nullable<bool>。因为 boolean 是一种值类型,所以不能将其设置为 null,但在某些情况下,您希望在数据访问类中使用,因为数据库字段可以具有 null 值。

于 2009-07-25T07:39:45.410 回答
3

另一个使用 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.");
于 2015-12-01T17:44:11.463 回答
2

bool可以只包含trueandfalse值,同时bool?也可以有一个null值。

于 2009-07-25T07:37:32.890 回答
0

bool 意味着你可以有 true 和 false 的值。布尔?意味着您可以有值 true、false 和 null。

它适用于日期时间和布尔值。

于 2013-12-04T12:44:47.710 回答
0

表示用 (double?) 声明的变量可以为空

double i1=0.2; //ok
double i2=null; //not ok

double? i3=0.1; //ok
double? i4=null; //ok
于 2021-07-04T03:34:27.653 回答