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.mzph.cn/pingmian/49903.shtml

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

相关文章

Keepalived和Haproxy

Keepalived和Haproxy 一、Keepalived 1、keepalived概念 调度器的高可用 vip地址主备之间的切换,主在工作时,vip地址值在主上,主停止工作,vip飘移到备服务器 在主备的优先级不变的情况下,主恢复工作,v…

C++——编译报重复定义错误的解决办法

原因: 头文件被多次编译。 解决办法: 找到包含头文件的地方,仔细检查。 比如: 这两句话是包含关系,写了第一句就不用第二句了。 因为:第一句是编译 tracker/detector/rknn_model_zoo/examples/yolov5/c…

【MySQL进阶之路 | 高级篇】简谈redo日志

1. 前言 事务有四种特性:原子性,一致性,隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢? 事务的隔离性由锁机制实现。而事务的原子性,一致性和持久性由事务的redo日志和undo日志来保证。 REDO LOG称为…

云计算实训13——DNS域名解析、ntp时间服务器配置、主从DNS配置、多区域DNS搭建

一、DNS域名解析 1.正向解析 将域名解析为IP地址 DNS正向解析核心配置 (1)安装bind [rootdns ~]# yum -y install bind (2)编辑配置文件 编辑named.conf文件,限定访问权限 [rootdns ~]# vim /etc/named.conf 编辑named.rfc文件,指定要访问的域名 [ro…

【数据结构】:用Java实现链表

在 ArrayList 任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为 O(n),效率比较低,因此 ArrayList 不适合做任意位置插入和删除比较多的场景。因此:java 集合中又引入了 LinkedList&…

一步一步测试DNS隧道

目录 0、前言 1、DNS解析 1.1 DNS简介 1.2 DNS查询类型 1.3 DNS解析过程 2、DNS隧道准备工作 2.1 DNS隧道介绍 2.1.1 什么是DNS隧道? 2.1.2 DNS隧道的原理 2.2 客户端、服务端准备 2.3 域名准备 2.4 连接隧道 2.5 遇坑 3、隧道确认和利用…

Windows本地启动Redis

找到本地redis目录 输入cmd,然后输入redis-server.exe redis.windows.conf,默认端口为6379 再新打开一个cmd,输入redis-cli.exe -p 6379 -a (你在redis.windows.conf中设置的密码)

如何做好服务器的安全管理

以下是一些服务器安全防护措施: 1、安装杀毒软件:安装杀毒软件是保护服务器免受病毒和恶意软件攻击的基本措施之一。保持杀毒软件更新至最新版本,定期扫描检测服务器以确保其不被病毒、蠕虫等恶意软件入侵。保护服务器免受侵害。像360杀毒&am…

HarmonyOS NEXT星河版零基础入门到实战

文章目录 一、HarmonyOS NEXT介绍学习内容1、鸿蒙APP开发2、能力套件开发3、全场景开发适合人群 持续更新中✒️总结 一、HarmonyOS NEXT介绍 放弃安卓框架之后,HarmonyOS NEXT成为真正独立于安卓、iOS的操作系统,堪称是一场史无前例的脱胎换骨。在其众多…

服务器利用宝塔面板部署Django项目

目录 1. 使用命令启动Django项目1.1 使用 Xshell 连接服务器1.2 安装Anaconda1.3 启动Django项目1.4 使用tmux实现项目的后台运行 2. 使用Python项目管理器部署项目2.1 安装宝塔面板和软件2.2 添加站点2.3 上传项目文件2.3.1 收集静态文件2.3.2 生成依赖文件 2.4 安装安装Pytho…

【周记】2024暑期集训第二周(未完待续)

文章目录 日常刷题记录合并果子题目解析算法思路代码实现 中位数题目解析算法思路代码实现 C学习笔记队列queue双端队列 deque优先队列 priority_queue定义常见操作 upper_bound 日常刷题记录 合并果子 题目解析 有一堆果子,每次可以将两小堆合并,耗费…

人的心体本乐,回归自己,清静快乐

94天 孔颜之乐,乐是心的本体;真乐,常人所共有; 人心本体,原来就没有什么不快乐的 - 陆元静问:孔颜之乐与七情之中的“ 乐 ”是否相同呢?我经常愁闷,未曾体会过“真乐”的感受&#x…

classfinal太强了,再也不怕被反编译了

这段时间在辛辛苦苦的编写一个算法程序,担心部署到客户服务器,客户反编译jar包,破解程序,那努力就白费了! 在网上查询,发现个好东东,classfinal可以加密jar包,防止反编译&#xff0…

华杉研发九学习日记18 集合 泛型

华杉研发九学习日记18 一,集合框架 1.1 集合和数组的区别 集合就是在java中用来保存多个对象的容器 集合是数组的升级版,集合中只能放置对象[object]. 数组: 在java中用来保存多个具有相同数据类型数据的容器 数组弊端: 1.数组只能保存…

【计算机网络】网络层——IPv4地址(个人笔记)

学习日期:2024.7.24 内容摘要:IPv4地址,分类编址,子网,无分类编址 IPv4地址概述 在TCP/IP体系中,IP地址是一个最基本的概念,IPv4地址就是给因特网上的每一台主机的每一个接口分配一个在全世界…

C语言 之 理解指针(4)

文章目录 1. 字符指针变量2. 数组指针变量2.1 对数组指针变量的理解2.2 数组指针变量的初始化 3. 二维数组传参的本质4. 函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用 5. 函数指针数组 1. 字符指针变量 我们在前面使用的主要是整形指针变量,现在要学…

实战练习之Linux上实现shell脚本自动化编程

实验拓扑要求 主机环境描述 注意: 172.25.250.101-172.25.250.105 共 5 个 IP 地址由servera.exam.com服务器进行提供。172.25.250.106 由 serverb.exam.com 服务器进行提供。 需求描述 1. 172.25.250.101 主机上的 Web 服务要求提供 www.exam.com Web站点&#…

A Comprehensive Study of Knowledge Editing for Large Language Models

大型语言模型(LLMs)在理解和生成与人类交流密切相关的文本方面表现出了非凡的能力。然而,一个主要的限制在于训练期间的大量计算需求,这是由于它们的广泛参数化而产生的。世界的动态性质进一步加剧了这一挑战,需要经常…

Unity UGUI 之Text 控件

本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 1.Text是什么 UI里面写文本的(注意是legacy Text,而不是TextmeshP…

前端网页打开PC端本地的应用程序实现方案

最近开发有一个需求,网页端有个入口需要跳转三维大屏,而这个大屏是一个exe应用程序。产品需要点击这个入口,并打开这个应用程序。这个就类似于百度网盘网页跳转到PC端应用程序中。 这里我们采用添加自定义协议的方式打开该应用程序。一开始可…