C#中数据到底存在堆上还是栈上_c# 自建类在栈里还是在堆里-CSDN博客
C#的栈与堆
首先复习一下值类型与引用类型
1. 值类型与引用类型
值类型:基本数据类型([int,long,float,char,bool]:System.ValueType,enum,struct)
引用类型:类(所有class),string,接口,数组
2. 栈与堆
局部变量,参数,调用现场存在栈中,一个线程的栈默认只有1M,栈要求先进后出的原则。
static的变量在静态存储区。
const的常量在常量存储区。
引用类型对象中的数据存放在堆内存中,由GC系统回收。
3. 数据到底储存在哪里?
引用类型的对象总是放在堆上。
值类型和指针总是放在它们被声明的地方。
如何理解呢?
其实很简单,看代码:
- public class C
- {
- //在类中被声明[跟随此类储存在堆中]
- int i = 0;//值类型
- //在类中被声明[跟随此类储存在堆中]
- S s = new S();//值类型
- //c:对象的引用[跟随此类储存在堆中]
- //new C():引用类型的对象永远储存在堆中
- C c = new C();//引用类型
- }
- public struct S
- {
- int i;//值类型
- S s;//值类型
- C c;//引用类型
- }
- //argI:值类型,在参数中被声明[储存在栈上]
- //argS:值类型,在参数中被声明[储存在栈上,且其中的值类型变量i和s都跟随他储存在栈上,而引用类型c的引用也跟随他储存在栈上,而c的对象储存在堆上]
- //argC:引用类型[对象的引用储存在栈上,而对象储存在堆上]
- void Main(int argI,S argS,C argC)
- {
- //如果argI,argS,argC定义在局部变量中也和定义在参数中类似
- int tmpI = 0;
- S tmpS = new S();
- C tmpC = new C();
- }
标签:储存,C#,栈上,int,引用,类型,new,堆里 From: https://www.cnblogs.com/yyxone/p/18391613