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…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
