【C#】--关于bool?和bool

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和其他网站查了下,总结下来了,@_@

posted @ 2013-03-12 11:07  kefira  阅读(10208)  评论(0编辑  收藏  举报