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# “值类型“和“引用类型“在内存的分配的主要内容,如果未能解决你的问题,请参考以下文章

引用类型值类型 理解

C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

C# 值类型和引用类型

C# 引用类型和值类型

C#中关于值类型和引用类型的个人理解

C# 泛型是引用类型还是值类型,是根据啥判断?