1、bool?和bool (VS2012版本下的)
bool关键字是System.Boolean的别名(实际上bool是基本值类型,Boolean是对象;bool是C#中的,Boolean是.net Framework中的。其实它们俩是一样啦,没什么差别的),用于生成变量存储布尔值true、false。bool数据类型在内存中占1个字节。但bool? 可以为null的类型(下面扩展中有解释的),包含三个不同的值:true、false和null。bool变量的默认值为 false,而bool?变量的默认值为 null。 所以 bool? 类型不能用在条件语句(如if、for或while)中,否则会导致编译器的错误。
例如:
bool? b=null; if(b) { }
上诉代码是不允许的,因为null 在条件上下文中的含义并不清楚,若要在条件语句中使用 bool?,请首先确定其HasValue不是null,然后再将它强制转换为bool;如果对使用null 值的 bool? 执行强制转换,那么将会引发 InvalidOperationException异常。
因此,微软给出下面的方法可以 将bool?安全的强制转换为bool (这个才是重点呢)
bool? test = null; ... if(!test.HasValue) //选择一个值 { test = IsInitialized(); } if((bool)test) { ... }
注意: 在C++中,bool 类型的值可以转换为 int 类型的值,也就是说:false 等效于零值,而 true 等效于非零值。但在C#中,不存在bool类型与其他类型之间的相互转换。
2、扩展:C#中使用可以为null的类型
(1)可以为null的类型有两种声明方式:
System.Nullable<T> variable 或 T? variable
T 是可以为null 的类型的基础类型,T 可以是包括 struct 在内的任何值类型,但不能是引用类型。其实 T? 意思就是 T范围值+ 上可为空的值。
(2)类型示例
任何值类型都可用作可以为 null 的类型的基础,如:
int? i = 10; double? d1 = 3.14; bool? flag = null; char? letter = 'a'; int?[] arr = new int?[10];
###### bool, string, int 这些叫做值类型(value type);Boolean, String, Int32这些叫做引用类型(Reference Type)。值类型是存在内存的 stack(堆栈)中的,而引用类型存在 heap(堆)中。
(3)成员
可以为 null 的类型的每个实例都具有两个公共的只读属性:
HasValue
HasValue 属于 bool 类型。 当变量包含非 null 值时,它被设置为 true。
Value
Value 的类型与基础类型相同。 如果 HasValue 为 true,则说明 Value 包含有意义的值。 如果 HasValue 为 false,则访问 Value 将引发 InvalidOperationException异常。
--后记:上课时老师提到的,然后我在CSDN和其他网站查了下,总结下来了,@_@