《CLR via C#》Part2之Chapter5 基元类型、引用类型和值类型(二)
2013-03-15 22:17
267 查看
引用类型和值类型
使用引用类型时,必须注意到一些性能损耗,要考虑以下事实:内存必须从托管堆上分配
堆上分配的每个对象都有一些额外的成员,这些成员必须初始化
对象中的其他字节(为字段而设)总是设置为0
从托管堆上分配一个对象时,总是强制执行一次垃圾收集操作
虽然FCL得大多数类型都是引用类型,但程序员使用最多的还是值类型,如果一个程序全部使用的是引用类型,那么它的性能会极度低下。
为了提升性能,CLR提供了名为“值类型”的轻量级类型。
值类型不受GC得控制。
.NETFrameworkSDK明确指出,哪些类型是值类型OR引用类型:
任何称为“类”的都是引用类型:System.Exception类、System.Random类;
结构或者枚举为值类型:System.Int32结构、System.Boolean结构、System.DayOfWeek枚举等。
以下代码演示了引用类型和值类型区别:
//引用类型(类)
[code]classIsaacRef{publicInt32x;}
//值类型(结构)
structIsaVal{publicInt32x;}
staticvoidValueTypeDemo(){
IsaacRefr1=newIsaacRef();//在堆上分配
IsaValv1=newIsaVal();//在栈上分配
r1.x=5;//提取指针
v1.x=5;//在栈上修改
Console.WriteLine(r1.x);//显示5
Console.WriteLine(v1.x);//显示5
IsaacRefr2=r1;//只复制引用(指针)
IsaValv2=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
}
[/code]
选择使用值类型还是引用类型
某些时候,值类型能提供更好的性能,具体说除非以下所有条件都满足,否则不应将一个类型声明为值类型:类型具有基元类型的行为。(即其中没有成员会修改类型的任何实例字段)
类型不需要从其他任何类型继承
类型也不会派生出其他类型
除了满足以上3个条件之外,还必须满足以下任一条件:
类型的实例较小(约16字节或者更小)
类型的实例较大(大于16字节),但不作为方法实参传递,也不从方法返回
相关文章推荐
- 《CLR via C#》Part2之Chapter5 基元类型、引用类型和值类型(一)
- 《CLR via C#》Part2之Chapter5 基元类型、引用类型和值类型(三)
- CLR Via C# 学习笔记(1) 基元类型 值类型 引用类型
- CLR Via C# 学习笔记(1) 基元类型 值类型 引用类型
- 带着问题读CLR via C#(四)基元类型,引用类型和值类型(下)
- 【CLR Via C#】第5章 基元类型、引用类型、值类型
- CLR Via C# 学习笔记(1) 基元类型 值类型 引用类型
- CLR via C#(02)-基元类型、引用类型、值类型
- 《CLR via C#》读书笔记 之 基元类型、引用类型和值类型
- 《CLR Via C#》 学习心得之三 基元类型、引用类型和值类型
- 带着问题读CLR via C#(三)基元类型,引用类型和值类型(上)
- CLR Via C# 第五章(基元类型,引用类型与值类型)(1)——读书笔记
- 跟小静读CLR via C#(02)-基元类型、引用类型、值类型
- 带着问题读CLR via C#(三)基元类型,引用类型和值类型(上)
- Read the "clr via C#" of 基元类型,引用类型,值类型(第五章)
- <NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型
- 读书笔记_CLR.via.c#第五章_基元类型_引用类型_值类型
- CLR Via C# 第五章(基元类型,引用类型与值类型)(2)——读书笔记
- 《CLR via C#》读书笔记--基元类型、引用类型和值类型
- 《CLR via C#》读书笔记(5)基元类型、引用类型和值类型