C#中栈和堆以及修饰符

关于堆中字符串的存放

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.xdnf.cn/news/1486168.html

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

相关文章

算法日记day 17(二叉树的最大、最小深度)

一、二叉树的最大深度 题目: 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2&#xff1…

Redis底层数据结构-双向链表

链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。C语言并没有内置这种数据结构,独立实现。 实现 节点结构adlist.h/listNode typedef struct listNode {// 前置节点struct listNode …

pycharm的开头中设置作者开发时间等信息成为模板

就是在pycharm中写代码的时候,开头会有一些代码相关的信息,比如说作者,比如说开发时间等等,如果每次都写比较麻烦,其实pycharm中可以设置成模板,而且时间还会自动更新。 一,打开pycharm点文件&…

Django cursor()增删改查和shell环境执行脚本

在Django中,cursor()方法是DatabaseWrapper对象(由django.db.connectio提供)的一个方法,用于创建一个游标对象。这个游标对象可以用来执行SQL命令,从而实现对数据库的增删改查操作。 查询(Select&#xff0…

设计分享—国外医疗行业界面设计

医疗诊断界面是一个直观且信息丰富的数字平台,它集成了患者基本信息、病史记录、当前症状描述、检查结果展示以及智能诊断建议等功能于一体。 界面设计简洁明了,便于医生快速浏览关键信息,同时利用先进的算法辅助医生进行精准诊断&#xff0…

鸿蒙系统(java方法以及数据结构)

在java中数据结构是以类和对象的形式实现的,常见的数据结构及其简单实现 1.数组(Array) 2.链表(Linked List) 3.栈(Stack) 4.队列(Queue) 5.哈希表(Hash…

elasticsearch8.14.1集群安装部署

elasticsearch安装部署,首先需要准备至少三台服务器,本例再windows11下安装三台vmware虚拟机,利用centOS7系统模拟服务器环境。 本例假设你已经安装了三台vmware和centOS7,且centOS7运行正常。接下来我们直接讲解elasticsearch下载…

Linux(linux命令)和Window(powershell)的查找命令

目录 LinuxWindow基本操作(1)Get-ChildItem(2)Get-ChildItem模糊查找1. 使用星号(*)通配符(常用)1、第一个命令:使用 `-Filter` 参数(常用)2、第二个命令:使用管道和 `Where-Object`3、差异2. 使用问号(?)通配符(不常用)3. 结合使用星号和问号(不常用)4. 使…

3GPP R18 Multi-USIM是怎么回事?(四)

前几篇主要是MUSIM feature NAS 部分内容的总结,这篇开始看RRC部分相关的内容,由于RRC部分内容过长,也分成了2篇。这篇就着重看下musim gap以及RRC触发UE离开RRC Connected mode相关的内容,直入正题, 上面的内容在overview中有提到,对应的是如下38.300中的描述。 处于网络…

【python 已解决】ZeroDivisionError: division by zero —— 深度解析与解决策略

【python 已解决】ZeroDivisionError: division by zero —— 深度解析与解决策略 在编程过程中,尤其是使用Python这类高级编程语言时,ZeroDivisionError是一个常见的运行时错误。这个错误发生时,意味着你的代码中尝试进行了除以零的操作&am…

【深度学习】yolov8-seg分割训练,拼接图的分割复原

文章目录 项目背景造数据训练 项目背景 在日常开发中,经常会遇到一些图片是由多个图片拼接来的,如下图就是三个图片横向拼接来的。是否可以利用yolov8-seg模型来识别出这张图片的三张子图区域呢,这是文本要做的事情。 造数据 假设拼接方式有…

wireshark过滤器,如何使用wireshark捕获指定域名的流量

过滤器比较高级,但是也很重要,我决定通过一个案例来学习过滤器的知识点。 比如,我现在访问 zhangdapeng.com 我希望能够捕获关于这个域名下的流量,该如何实现呢? 我选择了捕获以太网的流量,但是目前捕获到…

【Linux】从零开始认识多线程 --- 线程ID

在这个浮躁的时代 只有自律的人才能脱颖而出 -- 《觉醒年代》 1 前言 上一篇文章中讲解了线程控制的基本接口: 线程创建pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);: pthread_t *thread :输出…

43 华三AC登录Web页面

一 无线上WEB页面 1 创建vlan 56 [AC-KongZhi]vlan 56 2 退出 [AC-KongZhi-vlan56]quit 3 进入vlan三层口 配置IP地址 [AC-KongZhi]interface Vlan-interface 56 [AC-KongZhi-Vlan-interface56]ip address 192.168.56.55 24 4 在AC控制器与Host主机的接口上能通关vlan 5…

MySQL进阶之(十)事务和隔离级别

十、事务和隔离级别 10.1 事务10.1.1 事务介绍10.1.2 事务四大特性10.1.3 事务的状态10.1.4 如何使用事务01、事务控制语句02、事务操作 10.2 事务的隔离级别10.2.1 事务数据可见性和并发问题01、脏写(Dirty Write)/更新丢失02、脏读(Dirty R…

Python怎样读取URL生成PDF

1. 安装依赖的exe 需要在这个网址,安装一个exe包,地址:https://wkhtmltopdf.org/ 进入网址后,点这个位置: 选择一个你的操作系统的下载链接: 安装后的exe文件: C:\Program Files\wkhtmltopdf…

分布式服务框架zookeeper+消息队列kafka

一、zookeeper概述 zookeeper是一个分布式服务框架,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:命名服务,状态同步,配置中心,集群管理等。 在分布式环境下,经常需要对应用/服…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十四章 注册字符设备号

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

硅谷裸机云大宽带服务器连接不上是怎么回事?该如何处理

硅谷裸机云大宽带服务器连接不上的常见原因主要有网络设置、网络设备、服务端、软件和服务、物理层等,出现以上问题,RAK部落小编建议大家可以通过以下一系列的方法进行排查和解决。具体分析如下: 1.检查网络设置   核对配置信息&#xff1a…

微信小程序-CANVAS写入图片素材、文字等数据生成图片

微信小程序中,CANVAS写入图片素材、文字等数据生成图片,最终可将生成的 base64 格式图片保存至相册操作 Tips: 1、canvas 标签默认宽度 300px、高度 150px canvas 生成图片时,写入图片素材、文字等数据前,需要根据实…