当前位置: 首页 > news >正文

C# 值类型与引用类型的储存方式_堆栈_

目录

值类型

引用类型

修改stu3的值 stu也被修改了 为什么? (对象之间)

值类型中,值全在栈中单独存储,变量之间不会影响

结构体中,结构体全在栈中,结构体与结构体之间也不会相互影响

静态资源区


值类型

值类型的储存只需要一段储存 用来存放实际的数据  在中储存

int a = 10;

引用类型

需要两段内存

第一段(等式前)储存实际的数据 它在中储存
第二段(等式后) 是一个应用指针,指向数据在内存中储存数据的位置  

地址储存在栈中 通过栈中的地址快速的找到堆中的数据
对象与对象之间不会相互影响  通过new出来的对象都会在堆内存中开辟一块新的空间 

class Student
{public int age;public string name;public Student(int age, string name){this.age = age;this.name = name;}
}static void Main(string[] args)
{Student stu = new Student(20,"小明");Student stu1 = new Student(30,"李四");}

修改stu3的值 stu也被修改了 为什么? (对象之间)

因为将stu中存储的地址赋值给了stu3  它们两个是共用的一个地址 指向同一个堆内存 所以一个修改另外一个也会修改

Student类的对象之间,栈中的 stu3 = stu(stu3没有使用new重新开辟一块新的空间 ),其地址指向同一个堆内存中储存的数据

Student stu3 = stu;
stu3.age = 100;
Console.WriteLine(stu3.age);//100
Console.WriteLine(stu.age); // 20? 100?  输出为100

null  空 空对象 空引用  空对象会被垃圾回收机制回收(GC)

栈内存空间小 读取速度快
堆内存空间大 读取速度慢

值类型中,值全在栈中单独存储,变量之间不会影响

int num = 10;
int num1 = num;
num = 20;
Console.WriteLine(num); //20
Console.WriteLine(num1);//10

结构体中,结构体全在栈中,结构体与结构体之间也不会相互影响

static void Main(string[] args)
{
//结构体全在栈中
Dog d1 = new Dog("阿黄",2);
Dog d2 = new Dog();
// 结构体与结构体之间不会相互影响
d1.age = 100;
Console.WriteLine(d1.age);
Console.WriteLine(d2.age);
Dog d3 = d1;
d1.age = 1000;
Console.WriteLine(d1.age); // 1000
Console.WriteLine(d3.age); // 2 
}struct Dog{public string name;public int age;
//结构体即使 自己定义了 有参的构造函数  默认的无参的也会存在,如定义的 d2,但是类中会被覆盖public Dog(string name, int age){this.name = name;this.age = age;}}

在结构体中,即使自己定义了 有参的构造函数  默认的无参的也会存在,如定义的 d2,但是类中会被覆盖,若使用无参的还得再定义一个无参的构造函数。

静态资源区

 对于字符串常量来说 实际是储存在静态资源区的  即使在堆中用的字符串也是存放在静态资源区的  因为 如果用到重复的字符串时 他们指向的地址是一样的  会解决内存问题  字符串在静态资源区中是不会被改变的   看到的修改其实只是修改指向的位置  内容并没有修改

const string name = "小明";//const 定义常量

 

http://www.dtcms.com/a/294448.html

相关文章:

  • Java面试宝典:Spring专题一
  • C语言-函数
  • springboot 3.0 和 2.0 校验用的包不一样
  • 第1章第2章笔记
  • python自动化测试框架,封装方法方式
  • Vivado报错信息[Place 30-574] Poor placement for routing between an IO pin and BUFG
  • 【图像处理基石】如何对遥感图像进行目标检测?
  • 新手向:Pycharm的使用技巧
  • 14. 如何获取用户浏览器内核
  • Qt调试技巧与常见错误解决方法
  • 2025最新Mybatis-plus教程(二)
  • UE中:动态平衡与调度像素流实例方案
  • 【esp32s3】GPIO 寄存器 开发解析
  • 搭建 Android 开发环境JAVA+AS
  • AI赋能DBA:数据库管理与运维的智能化工具全景解析
  • 快手DHPS:国内首个实现基于RDMA 通信的可负载均衡高性能服务架构!
  • AI赋能数据库运维:智能工具如何重塑DBA工作范式
  • PointLLM - ECCV 2024 Best Paper Candidate
  • 深度图像滤波
  • rust嵌入式开发零基础入门教程(六)
  • 10. isaacsim4.2教程-RTX Lidar 传感器
  • centos9 ssh能连接密码不对
  • 用马尔可夫模型进行自动驾驶安全分析
  • 完整的 Redis 5.0 安装、配置及自启动步骤,包含开放端口和密码设置
  • 【网安-小迪】Day5:反弹SHELL不回显带外正反向连接防火墙出入站文件下载
  • 我的第一个开源项目|集成语音感知与云平台的多任务智能楼宇控制系统
  • GaussDB null的用法
  • 第一站之春晖小区——关爱老年人,我们在行动
  • 快速梳理遗留项目
  • QEMU RISCV TCG 详解二 -- RISCV CPU Representation