基元类型、引用类型和值类型
2013-09-02 21:18
211 查看
基元类型:
编译器直接支持的类型称为基元类型。基元类型都能映射到Framework类库(FCL)中存在的类型。例如:
int a=0;
System.Int32 a=0;
int a=new int();
System.Int32 a=new System.Int32();
这四行代码都能正确编译,并生成相同的IL。
引用类型和值类型:
CLR支持两种类型:引用类型和值类型。虽然FCL大多数都是引用类型,但我们用得最多的还是值类型。引用类型从托管堆中分配内存,C#使用new关键返回内存地址。使用引用类型,必须考虑以下事情:
1、内存必须从托管堆上分配
2、堆上分配内存的对象都有一些额外的成员,这些成员必须初始化
3、对象的其它字段所需的字节设为零
4、从托管堆上分配的对象,可能强制执行一次内存回收
如果所有的类型都使用引用类型,那么程序的性能将会明显的下降。值类型不受垃圾回收器控制,减少了程序所需的进行垃圾回收的次数。
所有的值类型都是从System.ValueType直接派生的,System.ValueType本身又是从System.Object派生的。
值类型的装箱和拆箱:
为了将一个值类型转换成引用类型,就要对值类型进行装箱操作,下面为装箱内部发生的事情:
1、在托管堆中分配内存
2、值类型的字段复制到新分配的堆内存
3、返回对象的地址
下面代码演示了装箱的过程:
Int32 a=5;
Object o=a;
首先定义一上值类型,紧接着把a(值类型)赋值给o(引用类型),此处就需要对a进行装箱操作。
接下来谈谈拆箱。一个已装箱的值类型实例在拆箱时,内部会发生这些事情:
1、如果对已装箱的实例引用为null,就会抛出一个“NullReferenceException”异常。
2、如果要拆箱的对象不是目标值类型的一个实例,就会抛出一个“InvalidCastException”异常。
Int32 x=4;
Object o=x;
Int16=(Int16)o;
前部分对Int32类型进行装箱,是没有问题的,后部分将对值类型x的引用拆箱,转成Int16,与原先未装箱时的值类型不配匹,应此,会抛出“InvalidCastException”异常。
以上部分内容参考《CLR Via C#》,欢迎指正以共勉...
编译器直接支持的类型称为基元类型。基元类型都能映射到Framework类库(FCL)中存在的类型。例如:
int a=0;
System.Int32 a=0;
int a=new int();
System.Int32 a=new System.Int32();
这四行代码都能正确编译,并生成相同的IL。
引用类型和值类型:
CLR支持两种类型:引用类型和值类型。虽然FCL大多数都是引用类型,但我们用得最多的还是值类型。引用类型从托管堆中分配内存,C#使用new关键返回内存地址。使用引用类型,必须考虑以下事情:
1、内存必须从托管堆上分配
2、堆上分配内存的对象都有一些额外的成员,这些成员必须初始化
3、对象的其它字段所需的字节设为零
4、从托管堆上分配的对象,可能强制执行一次内存回收
如果所有的类型都使用引用类型,那么程序的性能将会明显的下降。值类型不受垃圾回收器控制,减少了程序所需的进行垃圾回收的次数。
所有的值类型都是从System.ValueType直接派生的,System.ValueType本身又是从System.Object派生的。
值类型的装箱和拆箱:
为了将一个值类型转换成引用类型,就要对值类型进行装箱操作,下面为装箱内部发生的事情:
1、在托管堆中分配内存
2、值类型的字段复制到新分配的堆内存
3、返回对象的地址
下面代码演示了装箱的过程:
Int32 a=5;
Object o=a;
首先定义一上值类型,紧接着把a(值类型)赋值给o(引用类型),此处就需要对a进行装箱操作。
接下来谈谈拆箱。一个已装箱的值类型实例在拆箱时,内部会发生这些事情:
1、如果对已装箱的实例引用为null,就会抛出一个“NullReferenceException”异常。
2、如果要拆箱的对象不是目标值类型的一个实例,就会抛出一个“InvalidCastException”异常。
Int32 x=4;
Object o=x;
Int16=(Int16)o;
前部分对Int32类型进行装箱,是没有问题的,后部分将对值类型x的引用拆箱,转成Int16,与原先未装箱时的值类型不配匹,应此,会抛出“InvalidCastException”异常。
以上部分内容参考《CLR Via C#》,欢迎指正以共勉...
相关文章推荐
- 《CLR via C#》读书笔记--基元类型、引用类型和值类型
- CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段
- 基元类型、引用类型和值类型
- 05.基元类型、引用类型和值类型
- 第五章 基元类型引用类型和值类型
- 【C#进阶系列】05 基元类型、引用类型和值类型
- Chapter5 基元类型、引用类型和值类型
- CLR.Via第三版第五章 基元类型、引用类型和值类型
- [转]C#基元类型、引用类型和值类型以及装箱拆箱
- 《CLR Via C#》 学习心得之三 基元类型、引用类型和值类型
- [C#1] 3-基元类型、引用类型和值类型、装箱拆箱
- 第5章:基元类型、引用类型和值类型
- <NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型
- 基元类型、引用类型和值类型
- 第5章 基元类型、引用类型和值类型
- C# 基元类型 引用类型和值类型
- 《CLR via C#》读书笔记(5)基元类型、引用类型和值类型
- .Net框架程序设计-读书笔记(第五章 基元类型、引用类型和值类型)
- 《CLR via C#》读书笔记 之 基元类型、引用类型和值类型
- 引用类型和值类型