使用引用类型时,必须注意到一些性能损耗,要考虑以下事实:
虽然FCL得大多数类型都是引用类型,但程序员使用最多的还是值类型,如果一个程序全部使用的是引用类型,那么它的性能会极度低下。
为了提升性能,CLR提供了名为“值类型”的轻量级类型。
值类型不受GC得控制。
.NET Framework SDK明确指出,哪些类型是值类型 OR 引用类型:
任何称为“类”的都是引用类型:System.Exception类、System.Random类;
结构或者枚举为值类型:System.Int32结构、System.Boolean结构、System.DayOfWeek枚举等。
以下代码演示了引用类型和值类型区别:
//引用类型(类)
class IsaacRef{public Int32 x;}
//值类型(结构)
struct IsaVal{public Int32 x;}
static void ValueTypeDemo(){
IsaacRef r1 = new IsaacRef(); //在堆上分配
IsaVal v1 = new IsaVal(); //在栈上分配
r1.x = 5;//提取指针
v1.x = 5;//在栈上修改
Console.WriteLine(r1.x);//显示5
Console.WriteLine(v1.x);//显示5
IsaacRef r2 = r1;//只复制引用(指针)
IsaVal 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
}
<!-- .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } -->
某些时候,值类型能提供更好的性能,具体说除非以下所有条件都满足,否则不应将一个类型声明为值类型:
除了满足以上3个条件之外,还必须满足以下任一条件: