值类型和引用类型的区别
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也为小兰。
我是这样理解的,引用传递,引用的地址,一旦地址对应的值改变了,所有使用这个地址的值都会改变,牵一发而动全身。而值传递,是将值简单的做了一次复制粘贴的操作,就像电脑复制粘贴文件夹一样,原来文件夹的改变和新粘贴的文件夹的修改不会互相影响。
来源:CSDN
作者:王彤彤-Grace
链接:https://blog.csdn.net/wtt15100/article/details/104468261