值类型和引用类型

谁说胖子不能爱 提交于 2020-02-24 22:49:26

值类型和引用类型的区别

1.    值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的

地址。

2.将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不复制对象本身。

3. 值类型存取速度较快,引用类型存取速度较慢。

4. 值类型从System.ValueType类派生,引用类型从System.Object派生,其中,System.ValueType又是从System.Object

派生出来的,枚举从System.Enum抽象类派生,而System.Enum抽象类从System.ValueType派生出来的,所以枚举也是一个

值类型。

5.值类型不可能包含 null 值:

6.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。

栈和堆的区别

栈就是编译期间就分配好的内存空间,堆是程序运行期间动态分配的内存空间

.net中哪些是值类类型,哪些是引用类型?

以结构体和类说明值类型和引用类型的区别

结构体--值类型,类--引用类型

区别:类当中默认的有一个无参数的构造方法(构造函数),当在类中写一个有参数的构造函数,默认无参数的构造函数被干掉了

 类当中写构造函数参数列表中参数个数可以不确定,除了无参的构造函数之外,有参的构造函数也可以有多个重载

在结构中默认的也有一个无参数的构造函数,当在结构中写一个有参数的构造函数,默认的无参数的构造函数还有,没有被干掉

在结构中写构造函数要把所有的字段都要完全赋值,都要写在参数里面,参数的个数是所有字段的个数

            Person Zsperson = new Person();         //实例化
            Person Xlperson = new Person();
            Zsperson.Name = "张三";
            Zsperson.Gender = '女';
            Zsperson.Age = 21;
            Xlperson = Zsperson;                //将Zsperson的值赋值给Xlperson
            Xlperson.Name = "小兰";             //给Xlperson.Name重新赋值
            Console.WriteLine(Zsperson.Name);      
            Console.WriteLine(Xlperson.Name);     
            Console.WriteLine();
            Console.ReadKey();

如上述代码所示,如果Person是我们定义的一个结构体,此时给实例化出来的Zsperson的name,gender,age分别赋值为张三,女,24,此时将这些值复制给Xlperson,结构体是传值,就是把值做一个复制粘贴的操作,那么此时Xlperson的name,gender,age同样也是张三,女,24。这时候,我们重新给Xlperson的name赋值为小兰,不会影响到Zsperson,此时,Zsperson.Name为张三,Xlperson.Name为小兰。

同样是上面的代码,如果这时候的Person是我们定义的一个类,Zsperson和Xlperson分别是我们实例化出来的两个对象,给实例化出来的Zsperson的name,gender,age分别赋值为张三,女,24,此时还是将这些值给Xlperson,那么此时Xlperson的name,gender,age同样也是张三,女,24,但是这时候的传递不再简单的是一个值的复制,而是地址的传递,也就是说接下来我们重新给Xlperson的name赋值为小兰,Xlperson和Zsperson公用的是一个地址,重新赋值将他们地址对应的值改变了,所以不仅Xlperson的name为小兰,Zsperson的name也为小兰。

我是这样理解的,引用传递,引用的地址,一旦地址对应的值改变了,所有使用这个地址的值都会改变,牵一发而动全身。而值传递,是将值简单的做了一次复制粘贴的操作,就像电脑复制粘贴文件夹一样,原来文件夹的改变和新粘贴的文件夹的修改不会互相影响。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!