基元类型、引用类型和值类型

基元类型

  基元类型是编译器直接支持的类型,而不是Framework类库(FCL)中定义的类型,这种语法仅仅是为了增强代码的可读性。比如在C#中,int直接映射到Framework类库中的System.Int32类型。另外,使用int生成的代码与使用System.Int32时生成的IL代码是完全一致的。

基元类型、引用类型和值类型

 

checked和unchecked

   C#通过提供checked和unchecked操作符让程序员可以在代码的特定区域控制溢出检查。下面是一个使用了unchecked操作符的例子。

UInt32 invalid = unchecked((UInt32) (-1));

  除了checked和unchecked操作符,C#还支持checked和unchecked语句,它们造成一个块中的所有表达式都进行或不进行溢出检查:

checked{

    Byte b = 100;

    b = (Byte) (b + 200);  

}

 引用类型和值类型

  CLR支持两种类型:引用类型和值类型。引用类型总是从托管堆上分配的,C#的new操作符会返回对象的内存地址,也就是指向对象数据的内存地址。

  如果所有类型都是引用类型,应用程序的性能将显著下降。为了提升简单的、常用的类型的性能,CLR提供了名为“值类型”的轻量级类型。值类型的实例一般在线程栈上分配,在代表值类型实例的一个变量中,并不包含一个指向实例的指针。相反,变量中包含了实例本身的字段。值类型的实例不受垃圾回收器的控制。因此,值类型的使用缓解了托管堆中的压力,并减少了一个应用程序在其生存期内需要进行的垃圾回收次数。

  以下代码和图演示了引用类型和值类型的区别:

//引用类型(由于使用了‘class’)

class SomeRef{public Int32 x;}



//值类型(由于使用了‘struct’)

struct SomeVal{public Int32 x;}



static void ValueTypeDemo(){

    SomeRef r1 = new SomeRef();//在堆上分配

    SomeVal v1 - new SomeVal();//在栈上分配

    r1.x = 5;//提领指针

    v1.x = 5;//在栈上修改

    //下图的左半部分反映了执行以上代码之后的情况



    SomeRef r2 = r1;//只赋值引用(指针)

    SomeVal v2 = v1;//在栈上分配并复制成员

    r1.x = 8;//r1.x和r2.x都会改变

    v1.x = 9;//v1.x会更改,但v2.x不变



    Console.WriteLine(r1.x);//8

    Console.WriteLine(r2.x);//8  

    Console.WriteLine(v1.x);//9

    Console.WriteLine(v2.x);//5  

}

基元类型、引用类型和值类型

 

你可能感兴趣的:(引用类型)