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

时间:2009-07-25 07:34:37

标签: c# boolean nullable

我在C ++中习惯使用“bool”类型的变量,并尝试将我期望的函数或属性的值放入我的变量中。但是我经常遇到结果类型是“bool?”的情况。而不是“bool”,隐式演员失败。

两者之间有什么区别,每次使用时间是多少?另外,我应该使用“bool?”作为我的变量的类型?这是最好的做法吗?

9 个答案:

答案 0 :(得分:85)

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

boolvalue type,这意味着它不能是null,因此Nullable类型基本上允许您包装值类型,并且能够分配null给他们。

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

此外,没有为bool?

定义的短路运营商(&amp;&amp; ||)

仅定义逻辑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是一个结构,一个不能为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。

就是这样,这里发生的是默认的struct initialization

int? a = null;

相当于:

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

答案 1 :(得分:14)

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

bool? first;
bool second;

在上面的代码中,firstnullsecondfalse

一个典型用法是,如果您想知道是否已对变量进行了分配。由于bool值类型(就像intlongdoubleDateTime和其他一些类型一样),将始终初始化为默认值(falsebool0int。这意味着您无法轻易知道它是false,因为某些代码已分配false,或者它是false,因为尚未分配。在这种情况下,bool?会派上用场。

答案 2 :(得分:5)

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

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

  • 有价值:真实
  • 有价值:错误
  • 没有价值

答案 3 :(得分:4)

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

bool? x = null;

这完全可以。

答案 4 :(得分:3)

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

答案 5 :(得分:2)

bool只能包含truefalse值,而bool?也可以包含null值。

答案 6 :(得分:1)

另一个使用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.");

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

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

double? i3=0.1; //ok
double? i4=null; //ok