C# “值类型“和“引用类型“在内存的分配

简介: 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修饰可以通过对象名进行调用而不用实例化,还有常量等,常量也就是不会变的值,值并不会发生改变,也存储于这个区域

纯手打,点个赞呗~

相关文章
|
2月前
|
存储 程序员 编译器
在C语言中.如何正确地分配和释放内存docx
在C语言中.如何正确地分配和释放内存docx
31 1
|
2天前
|
存储 Java C#
C# 中的值类型与引用类型:内存大小解析
C# 中的值类型与引用类型:内存大小解析
12 2
|
2天前
|
存储 安全 Java
程序与技术分享:C#值类型和引用类型的区别
程序与技术分享:C#值类型和引用类型的区别
11 0
|
2月前
|
C语言
如何建立内存的动态分配
如何建立内存的动态分配
22 2
|
2月前
|
C语言
内存的动态分配
内存的动态分配
21 2
|
2月前
|
关系型数据库 MySQL Java
实时计算 Flink版操作报错之整内存和cpu分配之后启动报错如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
2月前
|
存储 程序员 C语言
动态内存:灵活分配
动态内存:灵活分配
|
2月前
为对象分配内存TLAB
为对象分配内存TLAB
|
2月前
|
存储 编译器 程序员
【C语言】内存的动态分配与释放
【C语言】内存的动态分配与释放
41 0
|
2月前
|
存储 C语言
怎样建立内存的动态分配
怎样建立内存的动态分配
14 0