C#类型

C#中的类型有两种:

(1)值类型-valueType

值类型的变量直接包含它们的数据

值类型包括:简单数据类型(int、float、bool、double、byte、char等等)、枚举类型(EnumType)、结构类型(StructType)

struct MyStruct
{
    public int value;
}

class Test
{
    static void setValue(MyStruct st)
    {
        st.value = 11111;
    }
    static void Main()
    {
        //在堆栈上创建m1,并直接存储了对象数据
        MyStruct m1 = new MyStruct();
        m1.value = 199;
        //在堆栈上创建了一个m1的副本,副本里有自己的对象数据
        MyStruct m2 = m1;
        //只是修改了m2这个副本自己本身的对象数据
        m2.value = 299;
        //把m2当做参数传递,因为m2是值类型,所以在函数体内其实修改的是m2的一个副本,m2自身的值不会改变
        setValue(m2);
        Console.WriteLine("m1.value = " + m1.value);//结果199
        Console.WriteLine("m2.value = " + m2.value);//结果299
    }
}

 

(2)引用类型-referenceType

引用类型的变量存储的是对相应数据的引用

引用类型包括:类类型(ClassType)、接口类型(InterfaceType)、数组类型(ArrayTpye)、委托类型(DelegateType)

class MyClass
{
    public int value;
}

class Test
{
    static void setValue(MyClass ms)
    {
        ms.value = 11111;
    }
    static void Main()
    {
        //堆栈上的m1存放的是托管堆上对象的地址
        MyClass m1 = new MyClass();
        m1.value = 199;
        //在堆栈上新建一个m2,引用的地址和m1是一样的,都是指向同一块托管堆上的内存对象
        MyClass m2 = m1;
        //对m2的修改,影响到了托管堆上的数值
        m2.value = 299;
        //把m2当做参数传递,因为m2是引用类型,这时形参复制了它的引用地址,临时变量的引用也指向托管堆的内存空间
        setValue(m2);
        Console.WriteLine("m1.value = " + m1.value);//结果11111
        Console.WriteLine("m2.value = " + m2.value);//结果11111
    }
}
posted @ 2012-09-06 23:05  Coder.Shen  阅读(335)  评论(0编辑  收藏  举报