C#常识篇(二)

news2024/11/24 17:41:43

委托和事件的区别

委托可以认为是对指定签名的函数的引用,通过委托可以实现将函数作为参数传递或者间接调用函数,委托是类型安全的,仅指向与其声明时指定签名相匹配的函数。委托可以分为单播委托和多播委托,二者的区别在于是对单个方法还是一组方法的引用,多播委托则可以通过特定的符号"+="和"-="来完成函数的订阅和取消订阅。

事件则是一种特殊的多播委托,其相比于普通的多播委托更加安全,事件将多播委托的调用权限隔离在其所在类的内部,并对外部关闭了直接通过赋值符号"="修改多播委托实例的入口,使得外部调用者仅能够进行基本的函数订阅和取消订阅的操作。

多播委托的底层实现 

多播委托实际上是一个类实例,其中定义了一个函数引用列表用于存储订阅的函数。当调用多播委托时,将由CLR来遍历该函数引用列表,并按照订阅顺序依次调用函数。

重载和重写的区别 

重载是一种编译时多态,重载函数的名称相同但参数列表不同,在调用时编译器会自动根据传递的参数列表适配指定形式的重载函数。

重写是一种运行时多态,子类重写父类的方法,在调用时根据实例对象的类型而适配重写函数。

for和foreach的区别 

以数组为例,for循环根据数组下标遍历元素,而foreach循环通过生成数组的临时迭代器来遍历元素,并且foreach循环是只读的,修改操作可能导致迭代器失效,例如一边遍历一边删除元素的行为。所以通常来说优先考虑使用for循环。

类和结构体的区别 

1.类的实例对象保存在堆上,而其引用保存在栈上;结构体的数据和存储其的变量均保存在栈上。

2.类能够实现继承、多态和封装,能够实现接口;结构体仅能实现接口。

3.类为引用类型,可以有多个变量指向同一个类的实例,其中一个变量对实例的修改就会影响其它变量;结构体为值类型,多个变量指向结构体的实例,实际上是各自存储了结构体的副本,所以各自的修改互不影响。

4.类更适合大型对象、需要封装较多行为或者需要实现继承和多态的情况;结构体则适用于轻量的或具有少量行为的或不可变的数据结构,结构体更偏向于数据而不是行为,这与类有所不同。

foreach的原理 

foreach是一种结合迭代器模式遍历实现了IEnumerable(或IEnumerable<T>)接口的容器类的语句,这两个接口会提供获取IEnumerator(或IEnumerator<T>)类型迭代器的方法,foreach会在运行时自动获取迭代器并启动对容器类的遍历。

协变和逆变 

协变则是将派生程度更大的赋值给派生程度更小的变量,逆变则是将派生程度更小的赋值给派生程度更大的变量。协变和逆变通常针对数组、委托和泛型参数,例如通过out或in关键字修饰泛型参数,使得方法组具有协变或逆变性,协变性通常体现在方法的返回类型,而逆变性通常体现在方法的参数类型。

结构体 

结构体隐式继承自System.ValueType,属于值类型,所以其数据和引用它的变量均存储在栈上。以下是结构体的一些特性:

1.无法实现多态和继承,但是可以实现接口,可以重写Equals、ToString、GetHashCode三个方法;

2.无法声明本结构体类型的字段或属性;

3.如果不存在属性且未自定义构造函数,可以不通过new关键字创建结构体实例,但是在使用该结构体实例前须对所有字段进行初始化;

4.自定义的构造函数将覆盖默认的无参构造函数,所以须通过new关键字创建结构体实例,自定义的构造函数须对所有字段进行初始化;

结构体偏向于数据而不是行为,通过变量将结构体实例赋值给其它变量时会涉及到结构体的拷贝,对结构体的拷贝会涉及更多的性能开销。结构体的进阶使用可以参考readonly和init关键字相关知识。

常见修饰符 

(1)public:能够在其声明所在的类或结构体甚至程序集外部访问,程序集外部访问需要引用其所在程序集;

(2)protected:能够在直接或间接派生类或其声明所在的类中访问;

(3)private:仅能够在其声明所在的类或结构体中访问;

(4)internal:能够在其声明所在的类或结构体之外但在所处程序集之内访问;

值得注意的是,未明确指定访问修饰符的类或结构体或接口默认为internal,未明确指定访问修饰符的类成员或结构体成员默认为private,接口成员默认为public。

静态构造函数 

静态构造函数用于初始化任何静态数据,或执行仅需执行一次的特定操作。 将在创建第一个实例或引用任何静态成员之前自动调用静态构造函数。 静态构造函数最多调用一次。如果静态字段的初始化并不复杂或者不涉及一些特殊的处理,那么建议在静态字段声明时即进行初始化,使用静态构造函数会影响运行时优化。常见的应用场景包括日志记录、创建非托管代码的包装类以及运行时的参数类型检查。

如果这篇文章对你有帮助,请给作者点个赞吧! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1489078.html

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

相关文章

WEB APIs (5)

window对象 BOM&#xff08;浏览器对象模型&#xff09; 其为js操作浏览器提供了方法 window对象是一个全局变量&#xff0c;是BOM树根节点 BOM的属性和方法都是window的&#xff0c;如document、console.log()等 var定义在全局全局作用域中的变量、函数都会变成window对象…

参数引入和全局变量引入实现-目标和

LCR 102. 目标和 - 力扣&#xff08;LeetCode&#xff09; 分析题意&#xff0c;画出决策树&#xff0c;其他的思路都跟前面讲过的类似&#xff1a; 全局变量引入实现&#xff1a; 全局变量的引入&#xff0c;需要手动处理回溯&#xff1b; class Solution {int ret; //…

群晖Synology Drive服务搭建结合内网穿透实现云同步Obsidian笔记文件夹

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-ebec69DBjtGk7apF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

Linux:进度条的实现

使用工具的简单介绍&#xff1a; 在创建进度条之前&#xff0c;首先要明白两个工具&#xff0c;fflush 和 \r 。 \r 回车键的功能其实是两个&#xff0c;一个是换行&#xff0c;一个是回车。所谓换行就是将光标从这一行变到下一行中&#xff0c;且是垂直下落&#xff0c…

【详识JAVA语言】类和对象

面向对象的初步认知 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。用面向对象的思想来…

leetcode移除元素

注意&#xff0c;在本题中&#xff0c;是对原数组进行操作&#xff0c;需要原地删除指定元素&#xff0c;所以我们可以采用快慢指针来操作。 顾名思义&#xff0c;快慢指针是有两个指针&#xff0c;一直快指针&#xff0c;一个慢指针。在本题中&#xff0c;快慢指针起点都是0&a…

MATLAB:Image Processing Toolbox工具箱入门实战

目录 1.基本图像导入、处理和导出 2.实战项目一&#xff1a;利用imfindcircles()函数检测和测量图像中的圆形目标 1.基本图像导入、处理和导出 Basic Image Import, Processing, and Export- MATLAB & SimulinkThis example shows how to read an image into the worksp…

在vue前端开发中基于refreshToken和axios拦截器实现token的无感刷新

文章目录 一、需求背景二、token刷新的方案1、根据过期时间重新获取2、定时刷新token接口3、使用了RefreshToken 三、关于RefreshToken四、Refresh Token的优点五、Refresh Token的工作原理六、Refresh Token的使用流程七、Refresh Token的实现步骤1、登录成功后保存AccessToke…

Studio One 6永久激活版 附完整图文安装破解教程

Studio One 6是一款功能强大的音乐制作和录音软件&#xff0c;专为Mac操作系统设计。它提供了多轨录音和混音、MIDI音乐制作、实时效果和处理、VST插件支持以及高级编辑和编排等丰富的功能。无论是专业音乐制作人还是音乐爱好者&#xff0c;都可以使用Studio One 6来创建和编辑…

爬虫案例一

首先我举一个案例比如豆瓣电影排行榜 (douban.com)这个电影&#xff0c;首先我们进去检查源代码 说明源代码有&#xff0c;说明是服务器渲染&#xff0c;可以直接那html 但是返回的结果是空&#xff0c;所以我们需要在头里面加上User-Agent 然后可以看到有返回的结果&#xff0…

网络学习:MPLS标签与标签分配协议—LDP

目录 前言&#xff1a; 一、MPLS标签 1、定义&#xff1a; 2、标签结构&#xff1a; 3、标签识别&#xff1a; 二、标签分配协议---LDP&#xff08;Lable Distribution Protocol&#xff09; 1、定义&#xff1a; 2、标签分配协议的种类&#xff1a; 3、LDP消息类型 …

C/C++平方和问题(蓝桥杯)

题目描述&#xff1a; 小明对数位中含有2、0、1、9 的数字很感兴趣&#xff0c;在1 到40 中这样的数包 括1、2、9、10 至32、39 和40&#xff0c;共28 个&#xff0c;他们的和是574&#xff0c;平方和是14362。 注意&#xff0c;平方和是指将每个数分别平方后求和。 请问&#…

从零开始学习Netty - 学习笔记 -Netty入门【协议设计和解析】

2.协议设计和解析 协议 在计算机中&#xff0c;协议是指一组规则和约定&#xff0c;用于在不同的计算机系统之间进行通信和数据交换。计算机协议定义了数据传输的格式、顺序、错误检测和纠正方法&#xff0c;以及参与通信的各个实体的角色和责任。计算机协议可以在各种不同的层…

第四十九回 吴学究双掌连环计 宋公明三打祝家庄-Python与HTTP服务交互

吴用请戴宗从梁山请来铁面孔目裴宣、圣手书生萧让、通臂猿侯健、玉臂匠金大坚来帮忙。又告诫扈家庄的扈成&#xff0c;打起来不要去帮祝家庄。 孙立把旗号改成“登州兵马提辖孙立”&#xff0c;来祝家庄找峦廷玉&#xff0c;被热情接待。 第三天&#xff0c;宋江派小李广花荣…

001 GUI编程简介

一个知识该怎么学&#xff1f; 这是什么该怎么玩能干什么 图形化程序应该包含并不限于如下组件 窗口弹窗面板文本框列表框按钮图片监听事件鼠标键盘事件 GUI介绍 核心技术&#xff1a;Swing与AWT 不流行原因&#xff1a;界面不美观、需要JRE环境 仍然学习的原因&#xf…

备战蓝桥杯---树形DP基础3

上一次我们讲了二叉苹果树&#xff0c;现在我们加一点难度&#xff0c;从二叉变成了多叉苹果树。 这样子我们就不可以直接按照上次的方法DP&#xff0c;我们其实可以发现&#xff0c;我们可以用类似背包的思想求解&#xff0c;这就是所谓的树上背包。 我们先加进第一个儿子来…

骨传导耳机哪个牌子好?六大选购窍门,帮你甩掉坑货!

很多用户对骨传导耳机的理解存在偏差&#xff0c;认为只要选择价格贵的、热度高的产品就能万事大吉&#xff0c;而实际却不是如此&#xff0c;要知道&#xff0c;随着骨传导耳机逐渐成为热门款式&#xff0c;目前的市场上的骨传导耳机品牌也变得五花八门&#xff0c;这其中就包…

springboot230基于Spring Boot在线远程考试系统的设计与实现

在线远程考试系统设计与实现 摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到…

数据库学习案例20240304-mysql数据库案例总结(碎片,统计信息)

1 表中的碎片 在InnoDB中删除行的时候&#xff0c;这些行只是被标记为“已删除”&#xff0c;而不是真正从物理存储上进行了删除&#xff0c;因而存储空间也没有真正被释放回收。InnoDB的Purge线程会异步地来清理这些没用的索引键和行。但是依然没有把这些释放出来的空间还给操…

ES核心概念(45-48)(56-62)(101-103)

ES集群 ES集群&#xff08;Cluster&#xff09;包含多个节点&#xff08;服务器&#xff09;&#xff0c;整体提供服务 核心概念 索引Index&#xff1a;类似于mysql中的表 映射Mapping:数据的结构信息 文档&#xff1a;相当于表中的一条记录 分片&#xff1a; 将数据分成多片…