C#中值传递、引用传递/堆与栈

值类型:(整形)int、(长整形)long、(浮点型)float、(字符型)char、(布尔型)bool、(枚举)enum、(结构)struct

引用类型:(基类)Object、(字符串)string、(类)class、(接口)inferface、(数组)int[]

储存方式:

引用类型:数据储存在堆中,引用储存在栈中;

值类型:数据直接储存于栈中。视情况而定,比如类中声明了一个int类型的值类型,那么这个值类型就储存于堆中。

区别:

继承

值类型继承于System.ValueType类

 引用类型继承于System.Object类

赋值

    //值类型

     int i = 0;
     int j = i;
     j = 1;

     Console.Write(i + "\t" + j); //输出  0   1

    //引用类型

    int[] arry = new int[] {1};
    int[] arry1 = arry;
    arry1[0] = 0;

    Console.Write(arry[0] + "\t" + arry1[0]); //输出 0 0

看下方是图,就明白了

值类型的数据再次创建的时候是直接在栈中再次开辟一个空间,就是两个空间,互不影响!所有当我们修改 的值的时候,是不会影响 的值!

引用类型数据是引用的,当我们修改了里面的数据的时候,其他引用者自然随之而改变!

堆与栈

储存方式如图所示,可以看到,值类型和引用是储存在栈中的,引用的值是储存在堆中的!

然后的话栈是先进后出的,就是说如果要清理的话会先清理最后面放进来的

堆在C#中其实是叫托管堆,他与堆是不同的,在.NET中它是由CLR(公共语言运行库(Common Language Runtime))管理,当堆中满了之后,会自动清理堆中的垃圾!

猜你喜欢

转载自blog.csdn.net/qq_42766492/article/details/82024249
今日推荐