C# 引用类型与值类型的区别

//引用类型(使用了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中
        }
    }
}

 

posted @ 2013-11-14 09:04  iEvent  阅读(344)  评论(0编辑  收藏  举报