您的位置:首页 > 其它

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

2014-08-15 14:08 141 查看

基元类型

  基元类型是编译器直接支持的类型,而不是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
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: