C#常识篇(一)
面向对象的三大特性
继承:子类通过继承父类来获取基础特性,并且能够基于父类进行扩展以及提升代码的复用性。继承具有传递性,例如A继承自B,C继承自A,那么C就间接继承自B。在C#中,每个类仅允许继承一个父类。继承能够让程序的结构更加明晰。
封装:将数据和行为封装为一个独立的单元,对外部隐藏具体的实现细节,仅提供必要的调用接口,从而简化外部调用和提升代码的复用性和可维护性。
多态:同一操作针对不同的的对象或应用情景而存在不同的行为,例如运行时的多态——重写,编译时的多态——重载,重写则是根据不同的实例对象而表现不同的行为,重载则是根据传递的参数而自动选择对应的行为。
值类型和引用类型
在C#中值类型继承自System.ValueType类,包括整型、浮点型、布尔类型、字符型四种简单值类型,以及结构体和枚举两种复合值类型,这些简单值类型本质上就是结构体。引用类型继承自System.Object类,包括class、delegate、array、object等。
GC
GC是一种垃圾回收机制,为了高效、便捷和安全地管理内存,C#中采用了自动垃圾回收机制,由系统代理内存管理,从而提高开发效率和避免内存泄漏等问题。C#的GC采用的是"标记-清理"算法和分代管理方式。
(1)"标记-清理"算法是从根对象开始,根据对象的引用关系递归标记可达对象,在清理阶段则对不可达对象进行内存清理,某些GC还会在清理阶段进行内存压缩从而减少内存碎片化。
(2)分代管理是在托管堆上根据所创建对象的生命周期进行分类,刚创建的对象被称为"第一代",在上一次"标记-清理"阶段存活下来的对象会被分类为"第二代",以此类推,分代管理的目的是为了通过控制对象进行"标记-清理"的频率从而提高GC的效率。
反射
反射是一种在运行时动态访问程序集的方式。在C#中通过System.Reflection命名空间中的API在运行时获取程序集的元数据,通常我们可以通过获取指定类型的Type对象再通过反射获取其字段、属性和方法等成员,实现在运行时间接操作对象,不过反射通常会带来一定的性能开销,所以不建议大量使用。
StringBuilder和String
StringBuilder顾名思义就是字符串构建器,对StringBuilder对象的操作是基于可变内存缓冲区的,这个特性减少了创建新对象的需求,相较于String类型,它更适合频繁操作字符串的应用场景,但是它不是线程安全的。String类型是不可变的,对其进行的字符串操作通常涉及到需要创建新的String类型对象。总而言之,对于需要频繁操作字符串的情况建议使用StringBuilder类型,反之使用String类型。
常见容器类
(1)数组(Array):在定义或初始化时需要明确指定数组长度的容器类,严格意义上来说数组可以进行数据修改,但是无法进行增加和删除,因为数组的长度是固定的,要对数组进行增加和删除操作,通常需要创建一个新的数组对象。数组的内存是连续的,所以其查询和修改的效率是可观的,其通常适合存储一些数量固定的数据。
(2)列表(List<T>):列表可以看作是一个动态的泛型数组,能够根据需要动态调整容量大小,避免了ArrayList中的装箱和拆箱操作,由于其底层实现依旧是数组,所以增加和删除操作是耗时操作。
(3)栈(Stack<T>):栈是一种后进先出的数据结构,涉及到元素的入栈和出栈操作,后入栈的元素则先出栈,栈的操作仅支持栈顶操作,通常其不适合具有广泛的查询元素需求的应用场景。
(4)队列(Queue<T>):队列是一种先进先出的数据结构,涉及到元素的入队和出队操作,先入队的元素则先出队,队列的操作支持队首和队尾操作,通常其不适合具有广泛的查询元素需求的应用场景。
(5)字典(Dictionary<K,V>):字典是一种基于哈希表的数据结构,以键值对的方式保存元素,键唯一而值不唯一,同一个字典中不允许重复的键,但允许重复的值,因其基于哈希表的特性,所以对于元素的查询、插入和删除操作效率是可观的。
(6)集合(HashSet<T>):集合是一种基于哈希表的数据结构,它不允许存储重复的元素,所以非常适合需要去重的应用场景,因其基于哈希表的特性,所以对于元素的查询、插入和删除操作效率是可观的。
(7)哈希表(Hashtable):哈希表的底层实现是数组,数组元素由一种名为"桶"的数据结构组成,哈希表通过哈希函数将键映射到数组索引,严格来说一个键应该对应一个数组索引,当存在不同的键映射到同一个数组索引时则为哈希冲突,哈希表的设计关键则在于如何制定哈希函数和处理哈希冲突,处理哈希冲突常见的方法有链地址法和开放地址法,链地址法则是在数组索引处维护一个链表用于存储映射到该索引的不同键,而开放地址法则是通过一定的规则在哈希表中寻找到下一个可用的索引位置,然后插入元素。官方建议在新项目的开发中使用字典替代哈希表。
隐式继承和显式继承
在C#中通过英文符号":"来实现显式继承,显式继承则需要显式指定基类,而隐式继承通常由编译器隐藏基类,例如声明自定义类时并不需要显式继承System.Object,而由编译器自动完成这个继承行为,所以声明的自定义类即使没有显式继承自System.Object,但实际上却是System.Object的派生类,在编译时就会有所体现,可以通过自定义类的实例查阅到可调用的方法中包括System.Object的基本方法。
栈内存和堆内存
栈内存是基于栈这种数据结构构建的内存空间,通常用于存储代码上下文,例如某个被调用的函数的局部变量、参数和返回地址等信息,栈内存由编译器或解释器自动管理内存的分配和释放。
堆内存是基于堆这种数据结构构建的内存空间,通常用于存储动态分配的数据,例如实例对象和数组等,堆内存通常由程序员手动管理或者GC自动管理。
栈内存相比堆内存更轻量和便捷,访问更加快速,内存管理的性能开销更小;堆内存相比栈内存拥有更大的存储空间,其中的数据没有固定的生命周期,可以跨函数或代码块使用。值得注意的是堆内存可能涉及到内存碎片化的问题,并且涉及为对象分配合适的内存块而需要更大的性能开销。
析构函数
析构函数的形式是"~类名",且该函数无需添加任何修饰符,没有返回值也没有参数列表。析构函数是在对象销毁时自动调用的函数,尽管如此官方并不建议在该函数中去释放托管资源,因为GC执行析构函数的顺序是不确定的,自主释放托管资源可能导致未知错误。
抽象类和接口的区别
抽象类本质上是一种特殊的类,具备构造函数,能够声明和定义实例化的字段、属性以及函数,同时也能够声明抽象的函数,抽象类能够继承其它类和实现接口。与普通的类不同的是抽象类无法直接通过new创建实例,而需要通过其派生类间接创建实例,并且抽象类的抽象函数必须被派生类实现。
接口仅允许声明而不需要实现字段和函数,且均是公开的,接口可以嵌套实现其它接口,其相比抽象类是更高层次的抽象,所以同样无法创建实例。
如果这篇文章对你有帮助,请给作者点个赞吧!
相关文章:
C#常识篇(一)
面向对象的三大特性 继承:子类通过继承父类来获取基础特性,并且能够基于父类进行扩展以及提升代码的复用性。继承具有传递性,例如A继承自B,C继承自A,那么C就间接继承自B。在C#中,每个类仅允许继承一个父类。…...
Linux使用C语言获取进程信息
Linux使用C语言获取进程信息 Author: OnceDay Date: 2024年2月22日 漫漫长路,才刚刚开始… 全系列文章可查看专栏: Linux实践记录_Once_day的博客-CSDN博客 参考文档: Linux proc目录详解_/proc/mounts-CSDN博客Linux下/proc目录介绍 - 知乎 (zhihu.com)Linux内…...
tomcat通过JAVA_OPTS注入自定义变量 —— 筑梦之路
背景说明 tomcat部署的java应用在k8s集群或容器中,想要给tomcat传自定义变量,应该如何实现? 解决方法 1. 在k8s集群或容器环境中通过env或者configmap方式添加自定义的环境变量 比如: my_key: aaaa 2. tomcat下新增脚本&am…...
Linux——简单的Shell程序
📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、Shell程序思路二、Shell代码展示 一、Shell程序思路 用下图的时间轴来表示事件的发生次序…...
计算机网络-网络互联与互联网(一)
1.常用网络互联设备: 1层物理层:中继器、集线器2层链路层:网桥、交换机3层网络层:路由器、三层交换机4层以上高层:网关 2.网络互联设备: 中继器Repeater、集线器Hub(又叫多端口中继器…...
Android 解决后台服务麦克风无法录音问题
Android 解决后台无法录音问题 问题分析问题来源解决方案1. 修改清单文件:`AndroidManifest.xml`2. 修改启动服务方式3. 服务启动时创建前台通知并且指定前台服务类型参考文档最后我还有一句话要说我用心为你考虑黄浦江的事情,你心里想的却只有苏州河的勾当 问题分析 安卓9.…...
【计网】TCP的三次握手四次挥手
🍎个人博客:个人主页 🏆个人专栏:JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 三次握手(Connection Establishment) 四次挥手(Connection Termination) 结语 我…...
android pdf框架-4,分析vudroid源码2
继续分析源码 阅读器的入口 MainBrowserActivity,这个是主ui,由于代码较旧,所以没有处理sdcard的权限. 一般阅读器申请整个卡的读写. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {if (!Environment.isExternalStorageManager()) {Intent intent = new Intent…...
[算法沉淀记录] 排序算法 —— 希尔排序
排序算法 —— 希尔排序 算法介绍 希尔排序(Shell Sort)是一种基于插入排序的算法,由Donald Shell于1959年提出。希尔排序的基本思想是将待排序的序列划分成若干个子序列,分别进行插入排序,待整个序列中的记录基本有…...
conda 进入虚拟环境命令报错
问题描述 conda-script.py: error: argument COMMAND: invalid choice: activate 解决方案: 在终端命令先执行 conda init,重置conda环境。然后退出终端,重新进入终端即可conda activate env了。...
域名 SSL 证书信息解析 API 数据接口
域名 SSL 证书信息解析 API 数据接口 网络工具,提供域名 SSL 证书信息解析,多信息查询,毫秒级响应。 1. 产品功能 提供域名 SSL 证书信息解析;最完整 SSL 属性信息解析;支持多种元素信息抽取,包括主题的可…...
学习JAVA的第二天(基础)
目录 基本概念 关键字 class关键字 字面量 练习 变量 定义格式 变量使用 数据类型 基本数据类型 标识符 命名规则 键盘录入 1.导包 2.创建对象 3.接受数据 运算符 算术运算符 练习 隐式转换(自动类型提升) 强制转换 自增自减运算符 …...
代码随想录算法训练营第二十七天|93.复原IP地址、78.子集、90.子集II
93.复原IP地址 刷题https://leetcode.cn/problems/restore-ip-addresses/description/文章讲解https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html视频讲解https://www.bilibili.com/video/BV1XP4y1U73i/?vd_sourceaf4853e80f89e28094a5fe1e220d9…...
【蓝桥备赛】字串简写
字串简写 数据范围 字符串的长度为5*10的五次方,on方时间复杂度会很大。 才用动态规划的思想,dp[i]以i开头的的可能性,因为长度必须大于等于k,当i小于k的时候,如果等于第一个字符,s1时,dp[…...
nios ii开发随笔
错误一: d:/intelfpga/17.1/nios2eds/bin/gnu/h-x86_64-mingw32/bin/../lib/gcc/nios2-elf/5.3.0/../../../../../H-x86_64-mingw32/nios2-elf/bin/ld.exe: test.elf section .text will not fit in region ram_oc_xzs d:/intelfpga/17.1/nios2eds/bin/gnu/h-x86_6…...
SpringBoot项目嵌入RabbitMQ
在Spring Boot中嵌入RabbitMQ可以通过添加相应的依赖来完成。首先需要在pom.xml文件中引入spring-boot-starter-amqp依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</a…...
提升网络质量:UDPspeeder 实现网络优化与提速
提升网络质量:UDPspeeder 实现网络优化与提速 背景与意义原理与功能使用方法未来展望相关链接服务 在当今高度互联的网络环境下,网络质量的优化和提速对于用户体验至关重要。针对高延迟和丢包率较高的网络链路,UDPspeeder 提供了一种前向纠错…...
为什么前端开发变得越来越复杂了?这可能是我们的错
前端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~ Hello,大家好,我是 Sunday。 最近有很多同学来问我:“Sunday 老师,前端学起…...
VR系统的开发流程
虚拟现实(Virtual Reality,VR)系统是一种通过计算机技术模拟出的具有三维视角和交互性的虚拟环境,使用户能够沉浸在其中并与虚拟环境进行交互。这种技术通常利用头戴式显示器和手柄等设备,使用户能够感觉到仿佛身临其境…...
前端输入框校验限制不能输入中文
一般我们在做表单的时候都会有表单校验,通常都是用element提供的表单验证的功能,只需要通过 rules 属性传入约定的验证规则,如下面这样 rules: {userName: [{validator: checkUsername,trigger: "blur",},{ validator: this.checkData, trigge…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
