C# “值类型“和“引用类型“在内存的分配
Posted 生产队的驴.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# “值类型“和“引用类型“在内存的分配相关的知识,希望对你有一定的参考价值。
在代码中每创建一个变量,程序运行时都会在内存开辟一些空间存储这些值,所以写程序时创建的变量是越少越好(不积小流,无以成江海 -荀子)…
存储方式:
“值类型”存储于内存中的“栈”上
"引用类型"存储于内存中的“堆”上
静态类及变量存储于内存中的“静态存储区”
值类型有哪些?
int"整数"
double"高精度小数"
char(单字符)
decimal(小数)
bool(布尔)
enum(枚举)
struct(结构)
等等…
引用类型有哪些?
string
数组
自定义类
集合
object
接口
等等…
值类型内存分配:
值类型是存储于栈上
int i =50;
其中的0x2489(并非固定值)表示内存中的地址,并把50存储在里面,值改变时内存地址并不会变化,而是直接原值覆盖,这是值类型的内存分配
如果按下面写内存该怎么分配,开辟新空间,还是同时指向一个内存
int a =20;
int b =a;
两个地址不是相同的,说明是开辟了新空间
引用类型内存分配:
引用类型存储于堆,
string s =“富强民主”;
栈的地址指向了在堆中的地址
其中字符串(string)比较特殊,字符串每重新赋值,并不会覆盖原值,而是开辟新空间存储
string a =“富强民主”;
a=“文明和谐”;
a=“自由平等”;
string a = “1”;
a = “2”;
a = “3”;
a = “4”;
可以看出每一次堆的地址都改变了,都开辟了新的内存,并不是覆盖
string a =“123”;
string b =“123”;
因为内容相同,他在堆中用的是同一块内存
栈中的地址 0X0058ee98
堆中的地址 0X027c233c
可以看出 a 和 b 的地址是一样的,说明指向的是同一块内存
如果其中有一个值方式变化则会开辟新空间
string a = “123”;
string b = “123”;
b = “6”;
堆中地址发生改变
静态存储区:
静态存储区,分别存放静态类或者方法,被static关键字修饰的都存储于静态存储区,他们在程序运行时即开辟空间,程序关闭时才会释放内存, 被stat修饰可以通过对象名进行调用而不用实例化,还有常量等,常量也就是不会变的值,值并不会发生改变,也存储于这个区域
纯手打,点个赞呗~
以上是关于C# “值类型“和“引用类型“在内存的分配的主要内容,如果未能解决你的问题,请参考以下文章