C#中栈和堆以及修饰符

news2024/11/25 0:28:23

关于堆中字符串的存放

string s1="123"
string s2="123"
string s1="456"

此时s1输出为456 而s2仍然为123

因为在使用 String str = "字符串" 的方式来创建String变量的时候,那么String的值便会存储在String常量池中,在我们以这种方式创建String变量时,编译器会先判断你这个内容有没有已经在常量池出现过了,如果已经出现过,那么就不会再在常量池中使用空间来存放一个相同的内容,这个内容只会固定有一个引用,所以在创造相同内容的String的时候,他们的引用都是相同的。又有一种情况:一开始A和B内容相同,就是说s1与s2的引用都相同时,此时将s1的内容更改,那么s1的内容在常量池中就会使用另一块空间,那么相应的s1的引用也会改变,而s2的引用并不会改变,因为s2此时还是存储的原来的内容。我们可以来看简易的图解:

栈区、堆区、常量区、静态区、代码区 ,static的变量放在静态区

在C#中,内存管理是由.NET运行时(CLR - Common Language Runtime)负责的。CLR将内存分为几个不同的区域,用于存储不同类型的数据。以下是这些区域的简要说明:

  1. 栈区(Stack)

    • 栈是一种后进先出(LIFO - Last In, First Out)的数据结构。

    • 局部变量和方法调用时的参数通常存储在栈上。

    • 栈的大小是有限的,并且在线程创建时分配。

  2. 堆区(Heap)

    • 堆是用于动态内存分配的内存区域。

    • 对象通常是在堆上分配的。

    • .NET运行时的垃圾回收器负责管理堆内存,自动回收不再使用的对象。

  3. 常量区(Read-Only Data Section)

    • 常量数据存储在只读数据区,这些数据在程序的整个生命周期内都不会改变。

  4. 静态区(Static Data Section)

    • 静态变量和类变量存储在静态区。

    • 静态变量的生命周期与应用程序域的生命周期相同,它们在第一次使用时初始化,并在应用程序域卸载时销毁。

  5. 代码区(Code Section)

    • 包含编译后的程序代码,即中间语言(MSIL - Microsoft Intermediate Language)代码。

    • 代码区是只读的,存储了方法的IL代码和元数据。

  6. JIT编译后的代码

    • 虽然不是传统意义上的内存区域,但.NET运行时的JIT(Just-In-Time)编译器会将IL代码编译成本地机器代码,这些代码在执行时存储在内存中。

  7. 全局常量区

    • 有些实现可能还有一个全局常量区,用于存储全局常量。

  8. 线程局部存储(Thread Local Storage, TLS)

    • 用于存储线程特有的数据,比如线程的堆栈底和线程的异常处理上下文。

关于 static 变量,它们确实存储在静态区。每个 static 变量都属于一个类或结构,而不是类的实例。因此,它们在程序集加载时初始化,并在程序集卸载时释放。由于 static 变量与任何特定实例无关,它们在整个应用程序域中是唯一的。

修饰符介绍

在C#中,修饰符(Modifiers)用于定义类、方法、属性、字段等成员的访问级别和行为。以下是一些常用的修饰符:

  1. 访问修饰符

    • public:成员可以被任何其他代码访问。

    • private:成员只能在其定义的类内部访问。

    • protected:成员只能在其定义的类或派生类中访问。

    • internal:成员只能在同一个程序集(Assembly)中访问。

    • protected internal:成员可以在同一个程序集或派生类中访问。

  2. 非访问修饰符

    • static:表示该成员属于类本身,而不是类的实例。

    • const:表示一个常量,其值在编译时已知,并且在运行时不可更改。

    • readonly:表示一个字段可以在声明时或构造函数中被赋值,但之后不可更改。

    • abstract:用于声明抽象类或抽象方法,抽象方法必须在派生类中被重写。

    • sealed:用于阻止继承类进一步重写方法。

    • override:用于重写基类中的虚方法或属性。

    • virtual:用于声明一个方法或属性,该方法或属性可以在派生类中被重写。

    • event:用于声明事件,通常与委托一起使用。

    • new:用于隐藏继承类中的同名成员。

    • volatile:指示字段可能被多个线程同时访问,要求编译器和运行时确保对该字段的读写操作的原子性。

    • async:用于声明异步方法,允许使用 await 关键字。

    • unsafe:指示包含指针操作的代码块,只能在 unsafe 上下文中使用。

  3. 接口实现修饰符

    • 当实现接口成员时,可以使用 publicprivate 修饰符来指定实现的可访问性。

  4. 参数修饰符

    • ref:表示方法调用时传递的参数是按引用传递的。

    • out:类似于 ref,但调用者不需要在调用前初始化参数。

    • params:表示方法可以接收不定数量的参数,这些参数被封装在数组中。

  5. 特性修饰符(Attribute Modifiers):

    • 用于定义特性(Attribute)的适用范围,如 AttributeUsage

方法重载和重写

方法重载(Overloading)

方法重载是指在同一个类中可以有多个同名的方法,但它们的参数列表必须不同。参数列表的不同可以是参数的数量不同,或者是参数的类型不同。

特点

  • 方法名相同。

  • 参数列表不同(参数数量、类型、顺序)。

  • 返回类型可以相同也可以不同。

  • 重载方法在编译时进行解析。

方法重写(Overriding)

方法重写是指在派生类(子类)中重写基类中的虚方法(virtual)或抽象方法(abstract)。它允许派生类提供自己的实现方式。

特点

  • 基类方法必须被声明为 virtualabstractoverride

  • 派生类使用 override 关键字来重写方法。

  • 重写方法的访问级别不能比基类方法更严格。

  • 返回类型必须与被重写的方法一致,或者为基方法返回类型的子类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1941901.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DevExpress中文教程 - 如何在.NET MAUI应用中实现Material Design 3?

DevExpress .NET MAUI多平台应用UI组件库提供了用于Android和iOS移动开发的高性能UI组件,该组件库包括数据网格、图表、调度程序、数据编辑器、CollectionView和选项卡组件等。 获取DevExpress v24.1正式版下载 Material Design是一个由Google开发的跨平台指南系统…

linux、windows、macos清空本地DNS缓存

文章目录 Linux:Windows:macOS: Linux: 对于使用systemd的操作系统(如CentOS 7、Ubuntu 16.04),可以使用以下命令重启systemd-resolved服务来清除缓存: sudo systemctl restart sys…

Mistral联合英伟达开源12B小模型:碾压Llama 3,单张4090可跑

小模型,成为本周的AI爆点。 与动辄上千亿参数的大模型相比,小模型的优势是显而易见的:它们不仅计算成本更低,训练和部署也更为便捷,可以满足计算资源受限、数据安全级别较高的各类场景。因此,在大笔投入大模型训练之余…

【ROS2】高级:安全-设置访问控制

目标:限制节点可以使用的主题。 教程级别:高级 时间:20 分钟 内容 背景 修改 permissions.xml签署策略文件 启动节点 使用模板 背景 在继续之前,请确保您已完成设置安全教程。 权限非常灵活,可以用来控制 ROS 图中的许…

pytorch 笔记:torch.optim.Adam

torch.optim.Adam 是一个实现 Adam 优化算法的类。Adam 是一个常用的梯度下降优化方法,特别适合处理大规模数据集和参数的深度学习模型 torch.optim.Adam(params, lr0.001, betas(0.9, 0.999), eps1e-08, weight_decay0, amsgradFalse, *, foreachNone, maximizeFa…

MySQL root用户密码忘记怎么办(Reset root account password)

在使用MySQL数据库的的过程中,不可避免的会出现忘记密码的现象。普通用户的密码如果忘记,可以用更高权限的用户(例如root)进行重置。但是如果root用户的密码忘记了,由于root用户本身就是最高权限,那这个方法…

Vue自定义指令与Vue插槽学习

文章目录 自定义指令1.指令介绍2.自定义指令3.自定义指令语法4.指令中的配置项 自定义指令-指令的值1.使用效果2.语法 插槽-默认插槽1.作用2.用处4.插槽的基本语法 插槽-具名插槽1.作用2.具名插槽语法3.v-slot的简写 插槽总结1.插槽分类2.作用3.场景4.使用步骤 自定义指令 1.指…

WPS辟谣用户文档被用于AI训练:坚守个人信息保护底线

AITOP100平台获悉,7 月 21 日有网友在社交平台发文称“WPS 改版了用我们的文章喂给 AI 了”“WPS 疑似把我的审签内容喂给抖音豆包 AI”。这一消息引起了部分用户对于个人信息安全的担忧。针对这一传言,WPS官方客服微博于当日下午作出回应,明…

ARM功耗管理之功耗和安全

安全之安全(security)博客目录导读 思考:功耗与安全?超频攻击?欠压攻击?低功耗流程中的安全? 睡眠唤醒流程中,安全相关寄存器的备份恢复 举例:比如某DMA通道,芯片逻辑默认为安全通…

论文学习记录之一种具有边缘增强特点的医学图像分割网络

标题:一种具有边缘增强特点的医学图像分割网络 期刊:电子与信息学报-(2022年5月出刊) 摘要:针对传统医学图像分割网络存在边缘分割不清晰、缺失值大等问题,该文提出一种具有边缘增强特点的医学图像分割网…

【C语言】 利用栈完成十进制转二进制(分文件编译,堆区申请空间malloc)

利用栈先进后出的特性,在函数内部,进行除二取余的操作,把每次的余数存入栈内,最后输出刚好就是逆序输出,为二进制数 学习过程中,对存储栈进行堆区的内存申请时候,并不是很熟练,一开始…

【LaTeX Overleaf】 论文修订

对于在word中写的论文一般是使用【审阅】-【比较文档】来输出对比结果;对于overleaf,使用LaTeX排版,如何通过标记文字颜色来实现对比效果呢?? 1 批注功能-使用changes 宏包 在 LaTeX 中,changes 宏包是一个…

汽车技术智能化程度不断提升,线束可靠性如何设计?

随着汽车技术的高速发展,汽车自动化、智能化程度的逐步提高,人们对汽车的安全性、舒适性、娱乐性等要求也不断提高,加上汽车节能减排法规的不断严峻,整车电气设备不断增加,作为连接汽车各种电器设备“神经网络”的整车…

docker安装jenkins,并配置jdk、node和maven

拉取jenkins镜像 docker pull jenkins/jenkins:2.468-jdk21 创建一个文件夹,用于二次打包jenkins镜像 mkdir -p /data/jenkins cd /data/jenkins 提前准备好jdk和maven,并放到/data/jenkins下 由于8.x以上版本的maven只支持https协议,我们需…

分享一个最近在进行前后端联调时改了2天的bug...

场景再现 我们这边前端端口是8080 后端端口是8121 我们在前端里在首页面写了一个任务 当进入网页三秒后 发起一个叫getLoginUser的请求 我们的getLoginUser是调用的这里 一个异步请求 这边我们前端调用后端的接口也已经写好 我们先把后端跑起来 访问前端页面 接收到了这个…

源码搭建国内微短剧系统(APP+小程序)云存储配置流程

国内微短剧系统很多人不知道云存储和配置的操作流程,我整理了一份非常详细的操作文档流程,给大家介绍短剧系统云存储配置的详细操作流程。顺便推荐一下国内微短剧系统。 推荐下他们的开源地址:https://gitee.com/nymaite_com_2878868888/tjg…

arthas在idea和docker中的应用

基于IDEA工具使用 1&#xff0c;安装arthas插件 安装之后重启&#xff0c;然后再代码区域右键如果可以看到如下菜单选项&#xff0c;则说明安装成功 2&#xff0c;pom文件中配置arthas相关jar包 <!-- https://mvnrepository.com/artifact/com.taobao.arthas/arthas-pack…

JS 鼠标拖动实现移动滚动条的滚动效果

效果 现在很多场景都以移动端为基本开发&#xff0c;比如说需要隐藏滚动条&#xff0c;在pc上实现鼠标拖动和手机触摸拖动差不多的效果。 实现 以mdn的overflow属性中范例为基础&#xff0c;内容溢出时候可使用overflow: auto;和overflow: scroll;实现滚动效果。 要实现鼠标…

【Day1415】Bean管理、SpringBoot 原理、总结、Maven 高级

0 SpringBoot 配置优先级 从上到下 虽然 springboot 支持多种格式配置文件&#xff0c;但是在项目开发时&#xff0c;推荐统一使用一种格式的配置 &#xff08;yml是主流&#xff09; 1 Bean管理 1.1 从 IOC 容器中获取 Bean 1.2 Bean 作品域 可以通过注解 Scope("proto…

LeetCode 415.字符串相加 C++写法

LeetCode 415.字符串相加 C写法 思路&#x1f914;&#xff1a; 首先不能用stoi和tostring来做&#xff0c;如果给一个很大的数那一定存不下。我们可以从后往前一位一位的取&#xff0c;创建一个变量存储进位用于计算下一位数&#xff0c;之后取模得到当前数字&#xff0c;每一…