happyhippy

这个世界的问题在于聪明人充满疑惑,而傻子们坚信不疑。--罗素


    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来读取
}

    得出的结果是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;
        
//省略其他成员的定义.....
    }

    MSDN中解释bool与Boolean的关系是:“bool 关键字是 System.Boolean 的别名”。观察上面的Boolean类型定义,在其继承的泛型接口和成员变量中,我们找到了“bool”的影子(我想可能时Reflector将IL代码反汇编时将类型Boolean翻译成C#中的关键字bool),也就是说Boolean的定义依赖与bool(Boolean)。这就好比鸡蛋与鸡,到底是先有鸡蛋还是先有鸡?到底是先有Boolean的类型定义还是先有Boolean类型呢? 


附录 - Boolean类源码:

posted on 2007-04-12 16:58  Silent Void  阅读(2071)  评论(4编辑  收藏  举报