C#值类型和引用类型
| 值类型 | 引用类型 |
| int | 类 |
| char | 接口 |
| long | 数组 |
| float | 集合 |
| 枚举enum | |
| 结构struct |
class Person { public int num = 10; } struct Student { public int num; } static void Main(string[] args) { Person p1 = new Person(); p1.num = 10; //此时p1.num=10 Person p2 = p1; //引用类型赋值其实是把自己在内存堆中的地址指向了p2 p2.num = 20; //p2被赋值20,但是p2地址指向的还是p1,所以默认p1也变成了20 Console.WriteLine("p1={0},p2={1}",p1.num,p2.num); Student s1 = new Student(); s1.num = 10; //对结构变量s1.num赋值10 Student s2 = s1; //将s1赋值给了s2,其实是把10赋值给了s2,此时s2开辟了一个新空间 s2.num = 20; //又对s2进行了赋值,所以s2空间存的是20 Console.WriteLine("s1={0},s2={1}", s1.num, s2.num); Console.WriteLine("Hello World!"); }
- 值类型需要先确定内存大小
- 引用类型是动态分配的,比如集合本身确实无法在初始化时确定大小
-
- 值类型变量声明后,不管是否已经赋值,编译器为其分配内存。
- 引用类型当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。当使用 new 创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中。
- 值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中,比如在引用类型中声明值类型变量。
- 引用类型的对象总是在进程堆中分配(动态分配)。
- 装箱和拆箱
- 把值类型赋值给引用类型就是装箱
- 把引用类型转换成值类型就是拆箱
-
-
Console.WriteLine("{0},{1}",1,2); //经过两次装箱 Console.WriteLine("str" + 1 + 2);//经过两次装箱 Console.WriteLine(1+2+"str"); //经过一次装箱,因为代码从左向右执行,把前面的1+2先转换成3然后在执行字符串类型转换和拼接 Console.WriteLine(1); //没有经过装箱,直接调用int类型重载
-
请大家指点不足,提出建议,共同分享学习.

浙公网安备 33010602011771号