//引用类型(使用了class) class SomeRef{public Int32 x;} //值类型(使用了struct) struct SomeVal{public Int32 x;} static void ValueTypeDemo() { //引用类型在堆上分配空间,值类型在栈上分配,都用new初始化为0 SomeRef r1 = new SomeRef(); SomeRef v1 = new SomeVal(); //引用类型提领指针,值类型直接修改内容 r1.x = 5; v1.y = 5; //都显示5 Console.WriteLine(r1.x); Console.WriteLine(v1.x); //引用类型只复制引用指针,值类型在栈上分配并复制成员 SomeRef r2 = r1; SomeVal v2 = v1; //r1.x和r2.x都改成8,v1改成9,v2不变 r1.x = 8; v1.x = 9; //显示8,9,8,5 Console.WriteLine(r1.x); Console.WriteLine(v1.x); Console.WriteLine(r2.x); Console.WriteLine(v2.x); }
代码执行时内容分配情况
看内存,可以在性能选择上比较,值操作可以在数据方面比较,引用类有引用的好处,值类型也有它的优势
在值类型转换上,C#编译器会自动生成一个值类型的实例进行装箱所需的IL代码。但是需注意代码长度(应是堆占用空间吧)和性能问题
struct Point{public Int32 x,y;} public sealed class Program { public static void Main() { ArrayList a new ArrayList(); Point p; for(Int32 i = 0; i < 10; i++) { p.x = p.y = i; a.Add(p);//对值类型进行装箱,并将引用添加到ArrayList中 } } }