"bool"和"bool"之间有什么区别?和“布尔?"? [英] What's the difference between "bool" and "bool?"?

查看:168
本文介绍了"bool"和"bool"之间有什么区别?和“布尔?"?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I use the "bool" type for variables as I was used to in C++, and I try to put the values of functions or properties I expect to be boolean into my variable. However I often encounter cases where the result type is "bool?" and not "bool" and the implicit casting fails.

两者之间的区别是什么?何时使用?另外,我应该使用布尔"吗?作为我的变量的类型?这是最佳做法吗?

What is the difference between the two and when is each used? Also, should I use "bool?" as the type for my variable? Is this the best practice?

推荐答案

类型后的?符号只是

The ? symbol after a type is only a shortcut to the Nullable type, bool? is equivalent to Nullable<bool>.

bool值类型,表示它不能为null,因此Nullable类型基本上允许您包装值类型,并能够为其分配null.

bool is a value type, this means that it cannot be null, so the Nullable type basically allows you to wrap value types, and being able to assign null to them.

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

bool? can contain three different values: true, false and null.

此外,还没有为bool?

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

Only the logical AND, inclusive OR, operators are defined and they behave like this:

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类型基本上是一个通用结构,具有以下公共属性:

The Nullable type is basically a generic struct, that has the following public properties:

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

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

The HasValue property indicates whether the current object has a value, and the Value property will get the current value of the object, or if HasValue is false, it will throw an InvalidOperationException.

现在您一定想知道,Nullable是一个结构,一个不能为null的值类型,那么为什么以下语句有效?

Now you must be wondering something, Nullable is a struct, a value type that cannot be null, so why the following statement is valid?

int? a = null;

该示例将编译为以下内容:

That example will compile into this:

.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.

A call to initobj, which initializes each field of the value type at a specified address to a null reference or a 0 of the appropriate primitive type.

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

That's it, what's happening here is the default struct initialization.

int? a = null;

等效于:

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

这篇关于"bool"和"bool"之间有什么区别?和“布尔?"?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆