"bool"和"bool"有什么区别?

Roe*_*ler 55 c# boolean nullable

我使用"bool"类型作为变量,就像我在C++中习惯的那样,并且我尝试将我期望的函数或属性的值放入我的变量中.但是我经常遇到结果类型是"bool?"的情况.而不是"bool",隐式转换失败.

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

CMS*_*CMS 87

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

bool是一个值类型,这意味着它不能null,因此Nullable类型基本上允许您包装值类型,并能够分配null给它们.

bool?可以包含三个不同的值:true,falsenull.

此外,没有定义短路运算符(&& ||) 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
Run Code Online (Sandbox Code Playgroud)

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

public struct Nullable<T> where T: struct
{
    public bool HasValue { get; }
    public T Value { get; }
}
Run Code Online (Sandbox Code Playgroud)

HasValue属性指示当前对象是否具有值,并且该Value属性将获取该对象的当前值,或者如果HasValue为false,则将抛出InvalidOperationException.

现在你必须想知道一些东西,Nullable是一个结构,一个不能为null的值类型,为什么以下语句有效?

int? a = null;
Run Code Online (Sandbox Code Playgroud)

那个例子将编译成这个:

.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>
Run Code Online (Sandbox Code Playgroud)

initobj的调用,它将指定地址处的值类型的每个字段初始化为空引用或适当原始类型的0.

就是这样,这里发生的是默认的struct初始化.

int? a = null;
Run Code Online (Sandbox Code Playgroud)

相当于:

Nullable<int> a = new Nullable<int>();
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案,但我可以建议你说清楚bool吗?也是一个值类型,它实际上是一个包含类似{T值; bool _hasValue} (2认同)

Fre*_*örk 15

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

bool? first;
bool second;
Run Code Online (Sandbox Code Playgroud)

在上述代码中,firstnull同时secondfalse.

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

  • 请注意,这些默认值仅对实例/静态变量有效,而不对局部变量有效. (7认同)

Jar*_*Par 5

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

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

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


Kre*_*dns 5

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

bool? x = null;
Run Code Online (Sandbox Code Playgroud)

那就完全没问题了。