网站首页 文章专栏 浅谈.NET Framework基元类型
浅谈.NET Framework基元类型
编辑时间:2017-03-04 16:23 作者:Absolutely 浏览:654 评论:1
  • 什么是基元类型?

    初学者可能很少听说过这个名词,但是平时用得最多的肯定是基元类型。先看下面两行代码:


    System.Int32 a =5;
    int a =5; 


    上面两行代码都表示声明一个int类型的变量,但在平时写代码的时候我们一般用的是第二种方式。第二种方式不仅简洁、易读,而且生成的IL代码和第一种完全一致。像这种编译器直接支持的数据类型就称为基元类型。类似的还有double、bool、long、string等。

  • 基元类型与.NET框架类库的关系

    在我接触的第一份面试题中,我记得有这么一道题目:请谈谈C#中string和String的区别?

    我当时确实懵逼了,有区别吗?好像用的时候完全没有区别。其实二者说有区别也可以,说没区别也没错。因为基元类型sting直接映射到FCL中的String类型。所以本质上他俩是同一个东西。

    在C#中,基元类型都直接映射到.NET框架类库中存在的类型。之前看了一本书,关于这种映射有一种解释:

    using string= System.String;


    从这个角度可以认为,C#编译器假定所有源文件都添加了using指令。


    下面列举C#基元类型在FCL中对应的类型:

 C#基元类型  FCL类型  符合CLS  说明
 sbyte  System.SByte  否  有符号8位整数
 byte  System.Byte  是  无符号8位整数
 short  System.Int16  是  有符号16为整数
 ushort  System.UInt16  否  无符号16位整数
 int  System.Int32  是  有符号32位整数
 uint  System.UInt32  否  无符号32位整数
 long  System.Int64  是  有符号64位整数
 ulong  System.UInt64  否  无符号64位整数
 char  System.Char  是  16位Unicode字符
 float   System.Single  是  32位浮点数 
 double   System.Double  是  64位浮点数 
 bool   System.Boolean  是   true/false值
 string   System.String  是   字符数组 
 object   System.Object  是   所有类型的基类型 


FCL中只要符合公共语言规范(CLS)的类型,其他语言都提供了类似的基元类型,但是不符合CLS的类型,其他语言就不一定支持了。

  • 基元类型的使用

    C#编译器支持与类型转换、字面值以及操作符有关的模式。

    首先,编译器能执行基元类型之间的隐式或显示转换,例如: 

    int a =5;    //从Int32隐式转换为Int32
    long b = a;    //从Int32隐式转换为Int64
    byte d = (byte)a;    //从Int32显示转换为Byte
    short e = (short)a;    //从Int32显示转换为Int16


    System.Int64与System.Int32是不同的类型,而且不存在派生关系。那么他们之间为什么能隐式转换呢?原因是C#编译器非常熟悉基元类型,会在编译代码时应用自己的特殊规则。也就是说,编译器能识别常见的编程模式。

    但是,只有在转换安全的情况下,C#才允许隐式转换。所谓的安全是指不会发生数据丢失的情况。比如Int32转换为Int64。但如果可能不安全,C#就要求显示转换。对于数值类型,不安全意味着转换后可能丢失精度或数量级。例如Int32转Byte,Int32表示有符号32位二进制数,最大值为:2^16-1,而Byte表示无符号8位二进制数,最大值为:2^8-1,所以大的Int32可能丢失精度。

    除了转型,基元类型还能写成字面值。字面值可以堪称基元类型本身的实例。所以可以调用实例方法,例如:

    string a =123.ToString();    //Int32实例123调用ToString()方法


    此外,如果表达式由字面值构成,编译器在编译时就能完成表达式求值,例如:

    int a = 100+20+3;    //生成的代码将a的值设为123
    string b = "a"+"bc";    //生成的代码将b的值设为“abc”


    最后,编译器知道如何和以什么顺序解析代码中的基元类型和操作符之间的运算,例如:

    int a = 5;    //赋值操作
    int b = a +10;    //加和赋值操作
    bool c = (a<0);    //小于和赋值操作





参考文献:CLR via C#(第四版)


PS:新手正在学习.NET Framework,有什么错误希望各位指正!


作者:不落阁

出处:www.lyblogs.cn 

如需转载,请著名出处!


来说两句吧
最新评论
  • Absolutely
    Absolutely 2017-02-25 16:52:41
    这是我写的第一篇博客,最初在博客园发表,后来搬到自己的网站了!