当前位置: 首页 > news >正文

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#常识篇(一)

面向对象的三大特性 继承&#xff1a;子类通过继承父类来获取基础特性&#xff0c;并且能够基于父类进行扩展以及提升代码的复用性。继承具有传递性&#xff0c;例如A继承自B&#xff0c;C继承自A&#xff0c;那么C就间接继承自B。在C#中&#xff0c;每个类仅允许继承一个父类。…...

Linux使用C语言获取进程信息

Linux使用C语言获取进程信息 Author: OnceDay Date: 2024年2月22日 漫漫长路&#xff0c;才刚刚开始… 全系列文章可查看专栏: Linux实践记录_Once_day的博客-CSDN博客 参考文档: Linux proc目录详解_/proc/mounts-CSDN博客Linux下/proc目录介绍 - 知乎 (zhihu.com)Linux内…...

tomcat通过JAVA_OPTS注入自定义变量 —— 筑梦之路

背景说明 tomcat部署的java应用在k8s集群或容器中&#xff0c;想要给tomcat传自定义变量&#xff0c;应该如何实现&#xff1f; 解决方法 1. 在k8s集群或容器环境中通过env或者configmap方式添加自定义的环境变量 比如&#xff1a; my_key: aaaa 2. tomcat下新增脚本&am…...

Linux——简单的Shell程序

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、Shell程序思路二、Shell代码展示 一、Shell程序思路 用下图的时间轴来表示事件的发生次序…...

计算机网络-网络互联与互联网(一)

1.常用网络互联设备&#xff1a; 1层物理层&#xff1a;中继器、集线器2层链路层&#xff1a;网桥、交换机3层网络层&#xff1a;路由器、三层交换机4层以上高层&#xff1a;网关 2.网络互联设备&#xff1a; 中继器Repeater、集线器Hub&#xff08;又叫多端口中继器&#xf…...

Android 解决后台服务麦克风无法录音问题

Android 解决后台无法录音问题 问题分析问题来源解决方案1. 修改清单文件:`AndroidManifest.xml`2. 修改启动服务方式3. 服务启动时创建前台通知并且指定前台服务类型参考文档最后我还有一句话要说我用心为你考虑黄浦江的事情,你心里想的却只有苏州河的勾当 问题分析 安卓9.…...

【计网】TCP的三次握手四次挥手

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 三次握手&#xff08;Connection Establishment&#xff09; 四次挥手&#xff08;Connection Termination&#xff09; 结语 我…...

android pdf框架-4,分析vudroid源码2

继续分析源码 阅读器的入口 MainBrowserActivity,这个是主ui,由于代码较旧,所以没有处理sdcard的权限. 一般阅读器申请整个卡的读写. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {if (!Environment.isExternalStorageManager()) {Intent intent = new Intent…...

[算法沉淀记录] 排序算法 —— 希尔排序

排序算法 —— 希尔排序 算法介绍 希尔排序&#xff08;Shell Sort&#xff09;是一种基于插入排序的算法&#xff0c;由Donald Shell于1959年提出。希尔排序的基本思想是将待排序的序列划分成若干个子序列&#xff0c;分别进行插入排序&#xff0c;待整个序列中的记录基本有…...

conda 进入虚拟环境命令报错

问题描述 conda-script.py: error: argument COMMAND: invalid choice: activate 解决方案&#xff1a; 在终端命令先执行 conda init&#xff0c;重置conda环境。然后退出终端&#xff0c;重新进入终端即可conda activate env了。...

域名 SSL 证书信息解析 API 数据接口

域名 SSL 证书信息解析 API 数据接口 网络工具&#xff0c;提供域名 SSL 证书信息解析&#xff0c;多信息查询&#xff0c;毫秒级响应。 1. 产品功能 提供域名 SSL 证书信息解析&#xff1b;最完整 SSL 属性信息解析&#xff1b;支持多种元素信息抽取&#xff0c;包括主题的可…...

学习JAVA的第二天(基础)

目录 基本概念 关键字 class关键字 字面量 练习 变量 定义格式 变量使用 数据类型 基本数据类型 标识符 命名规则 键盘录入 1.导包 2.创建对象 3.接受数据 运算符 算术运算符 练习 隐式转换&#xff08;自动类型提升&#xff09; 强制转换 自增自减运算符 …...

代码随想录算法训练营第二十七天|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的五次方&#xff0c;on方时间复杂度会很大。 才用动态规划的思想&#xff0c;dp[i]以i开头的的可能性&#xff0c;因为长度必须大于等于k&#xff0c;当i小于k的时候&#xff0c;如果等于第一个字符&#xff0c;s1时&#xff0c;dp[…...

nios ii开发随笔

错误一&#xff1a; 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依赖&#xff1a; <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</a…...

提升网络质量:UDPspeeder 实现网络优化与提速

提升网络质量&#xff1a;UDPspeeder 实现网络优化与提速 背景与意义原理与功能使用方法未来展望相关链接服务 在当今高度互联的网络环境下&#xff0c;网络质量的优化和提速对于用户体验至关重要。针对高延迟和丢包率较高的网络链路&#xff0c;UDPspeeder 提供了一种前向纠错…...

为什么前端开发变得越来越复杂了?这可能是我们的错

前端训练营&#xff1a;1v1私教&#xff0c;终身辅导计划&#xff0c;帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~ Hello&#xff0c;大家好&#xff0c;我是 Sunday。 最近有很多同学来问我&#xff1a;“Sunday 老师&#xff0c;前端学起…...

VR系统的开发流程

虚拟现实&#xff08;Virtual Reality&#xff0c;VR&#xff09;系统是一种通过计算机技术模拟出的具有三维视角和交互性的虚拟环境&#xff0c;使用户能够沉浸在其中并与虚拟环境进行交互。这种技术通常利用头戴式显示器和手柄等设备&#xff0c;使用户能够感觉到仿佛身临其境…...

前端输入框校验限制不能输入中文

一般我们在做表单的时候都会有表单校验,通常都是用element提供的表单验证的功能&#xff0c;只需要通过 rules 属性传入约定的验证规则&#xff0c;如下面这样 rules: {userName: [{validator: checkUsername,trigger: "blur",},{ validator: this.checkData, trigge…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...