C/C++中没有提供bool类型,我们可以用0和非0取而代之;而在.Net中则提供了一个Boolean类型,其实是对0/1的一个封装。下面我们来看下这段代码:
Boolean b
=
true
;
Console.WriteLine( sizeof (Boolean)); // 得到的结果是1byte
unsafe // 先要用/unsafe(项目属性->Build->Allow unsafe code)来关闭安全检查
{
int i = (int)&b;//取地址
Console.WriteLine(*(byte*)i);//上面得到bool类型占1byte,这里将Boolean中的值按byte来读取
}
Console.WriteLine( sizeof (Boolean)); // 得到的结果是1byte
unsafe // 先要用/unsafe(项目属性->Build->Allow unsafe code)来关闭安全检查
{
int i = (int)&b;//取地址
Console.WriteLine(*(byte*)i);//上面得到bool类型占1byte,这里将Boolean中的值按byte来读取
}
得出的结果是1,当Boolean变量b赋值为false时,得到的结果是0。虽然只用1个bit就可以表示0/1了,但计算机存储的最小单位是byte,没办法只好浪费另外7个bit了:)
现在转入正题来扯淡,出于对Boolean的好奇,我用Reflector反汇编了下mscorlib.dll,得到Boolean的源代码(完整的代码见附录),居然看到了下面的内容:
public
struct
Boolean : IComparable, IConvertible, IComparable
<
bool
>
, IEquatable
<
bool
>
{
private bool m_value;
//省略其他成员的定义.....
}
{
private bool m_value;
//省略其他成员的定义.....
}
MSDN中解释bool与Boolean的关系是:“bool 关键字是 System.Boolean 的别名”。观察上面的Boolean类型定义,在其继承的泛型接口和成员变量中,我们找到了“bool”的影子(我想可能时Reflector将IL代码反汇编时将类型Boolean翻译成C#中的关键字bool),也就是说Boolean的定义依赖与bool(Boolean)。这就好比鸡蛋与鸡,到底是先有鸡蛋还是先有鸡?到底是先有Boolean的类型定义还是先有Boolean类型呢?
附录 - Boolean类源码:
本文转自Silent Void博客园博客,原文链接:http://www.cnblogs.com/happyhippy/archive/2007/04/12/710928.html
,如需转载请自行联系原作者