“布尔”和“布尔”有啥区别?

Posted

技术标签:

【中文标题】“布尔”和“布尔”有啥区别?【英文标题】:What's the difference between "bool" and "bool?"?“布尔”和“布尔”有什么区别? 【发布时间】:2010-11-13 23:13:32 【问题描述】:

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

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

【问题讨论】:

What does "DateTime?" mean in C#?的可能重复 这似乎不是重复的。这是一个浮现在脑海中的问题。就像我。谢谢 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

bool? x = null;

而且完全没问题。

【讨论】:

【参考方案5】:

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

bool 是value type,这意味着它不能是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。

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

int? a = null;

相当于:

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

【讨论】:

这是一个很好的答案,但我可以建议您明确说明 bool 吗?也是一个值类型,它实际上是一个包含 T value; bool _hasValue 谢谢安东尼,我把我的帖子扩展了一点。 !((bool?)null) 的结果是null【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

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

具有值:真 值为:False 没有价值

【讨论】:

【参考方案9】:

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

bool? first;
bool second;

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

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

【讨论】:

请注意,这些默认值仅对实例/静态变量有效,对局部变量无效。

以上是关于“布尔”和“布尔”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

“关键字”和“别名类型”有啥区别? [复制]

c#中布尔值和布尔值的区别? [复制]

XOR 和 NOT-EQUAL-TO 有啥区别?

c语言中的boolean 和其他语言的有啥区别?

PostgreSQL 中位和布尔数据类型的区别

C语言中if和switch有啥区别?