基元类型、引用类型和值类型
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 }
相关文章推荐
- 第5章:基元类型、引用类型和值类型
- 第五章 基元类型引用类型和值类型
- CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段
- 05.基元类型、引用类型和值类型
- .Net框架程序设计-读书笔记(第五章 基元类型、引用类型和值类型)
- 第5章 基元类型、引用类型和值类型
- 基元类型、引用类型和值类型
- CLR.Via第三版第五章 基元类型、引用类型和值类型
- 《CLR via C#》读书笔记 之 基元类型、引用类型和值类型
- 【C#进阶系列】05 基元类型、引用类型和值类型
- 基元类型、引用类型和值类型
- <NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型
- 《CLR via C#》读书笔记(5)基元类型、引用类型和值类型
- Chapter5 基元类型、引用类型和值类型
- [转]C#基元类型、引用类型和值类型以及装箱拆箱
- C# 基元类型 引用类型和值类型
- 《CLR Via C#》 学习心得之三 基元类型、引用类型和值类型
- [C#1] 3-基元类型、引用类型和值类型、装箱拆箱
- 《CLR via C#》读书笔记--基元类型、引用类型和值类型
- CLR笔记:5.基元,引用和值类型