C#常识篇(二)

委托和事件的区别

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

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

多播委托的底层实现 

多播委托实际上是一个类实例,其中定义了一个函数引用列表用于存储订阅的函数。当调用多播委托时,将由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。

静态构造函数 

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IO 作业 24/2/26

1>思维导图 1> 使用消息队列完成两个进程间相互通信 #include<myhead.h> //定义一个消息类型 struct msgbuf {long mtype; //消息类型char mtext[1024]; //消息正文 }; //定义一个宏&#xff0c;表示消息正文大小 #define MSGSIZE sizeof(struct msgbuf…

深入理解计算机系统学习笔记

2.3整数运算 有时候会发现两个正数相加会得出一个负数&#xff0c;而比较表达式x<y和比较表达式x-y<0会产生不同的结果。这些属性是由于计算机运算的有限性造成的。理解计算机运算的细微之处能够帮助程序员编写更可靠的代码。 2 .3. 1 无符号加法 原理&#xff1a; 在正…

【技术分享】使用nginx完成动静分离➕集成SpringSession➕集成sentinel➕集成seata

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于技术点的相关分享吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 一、 使用nginx完成动静分离 1.下载…

c语言经典测试题5

1.题1 t0; while(printf("*")) { t; if (t<3) break; }关于上述代码描述正确的是&#xff1f; A: 其中循环控制表达式与0等价 B: 其中循环控制表达式与0等价 C: 其中循环控制表达式是不合法的 D: 以上说法都不对 我们来分析一下&#xff1a;printf的返回值…

mac 安装hbuilderx

下载 HBuilderX下载地址: 下载地址 选额mac版本点击下载 安装 如图&#xff0c;将HBuilderX拖到Applications&#xff0c;才是正确的安装姿势。 MacOSX&#xff0c;软件必须安装到/Applications目录&#xff0c;如未安装到此目录&#xff0c;可能会出现插件安装失败、项目创建…

使用Django的admin功能管理数据_vscode

之前的文章 项目 hello_django, app名 hello&#xff0c;已有的model LogMessage&#xff1a; https://blog.csdn.net/weixin_44741835/article/details/136202771?spm1001.2014.3001.5502 参考得到电子书&#xff1a;第八章。 https://www.dedao.cn/ebook/reader?idrEQKv6…

深入理解指针2

各位小伙伴们&#xff0c;我们继续来学习指针&#xff0c;指针和结构体以及动态内存管理对后面的数据结构学习有非常大的帮助&#xff0c;所有我们一定要把这些知识点学会。OK,正式进入学习之旅吧 1.数组名的理解 在上⼀个章节我们在使⽤指针访问数组的内容时&#xff0c;有这…

thinkphp+vue+mysql学生宿舍水电费报修管理系统 0s7h5

本文首先实现了学生宿舍管理系统技术的发展随后依照传统的软件开发流程&#xff0c;最先为系统挑选适用的言语和软件开发平台&#xff0c;依据需求分析开展控制模块制做和数据库查询构造设计&#xff0c;随后依据系统整体功能模块的设计&#xff0c;制作系统的功能模块图、E-R图…

BL、万科、中海地产、碧桂园、华润置地、佳兆业、金地商置、龙湖、绿城、融创、时代中国、旭辉、中国建筑校招笔试题

为了帮助应聘者更好地备战地产公司的招聘考试&#xff0c;我将介绍以下13套校招试题资料&#xff0c;涵盖了24 BL、24万科、24中海地产、碧桂园、华润置地、佳兆业、金地商置、龙湖、绿城、融创、时代中国、旭辉和中国建筑等知名房地产企业&#xff0c;为您提供全方位的备考资源…

(Linux学习一):Mac安装vmWare11.5,centOS 7安装步骤教程

一。下载vmware 官网地址&#xff1a;下载地址 由于我的电脑系统是Mac 10.15.6版本系统&#xff0c;我下载的是VMware Fusion 11.5版本&#xff0c;13是最新版本不支持安装需要系统在11以上。 百度网盘下载地址: VMware Fusion 11 VMware Fusion 12 VMware Fusion 13 下载需要…

K—近邻算法实际应用案例

K—近邻算法实际应用案例 1. 案例1&#xff1a;鸢尾花种类预测1.1 数据集获取和属性介绍1.1.1 scikit-learn中的数据集介绍1.1.2 sklearn数据集返回值介绍 1.2 数据可视化介绍&#xff08;查看数据分布&#xff09;1.3 数据集的划分1.4 特征工程1.4.1 归一化1.4.2 标准化 1.5 鸢…

Vue 卸载eslint

卸载依赖 npm uninstall eslint --save 然后 进入package.json中&#xff0c;删除残留信息。 否则在执行卸载后&#xff0c;运行会报错。 之后再起项目。

Vue+SpringBoot打造高校实验室管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

【vue3语法】开发使用创建项目等

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、vue3创建vue3v2函数式、v3组合式api响应式方法ref、reactive计算属性conputed监听属性wacthvue3 选项式生命周期父子通信父传子defineProps编译宏 子传父de…

Typora结合PicGo + 使用Github搭建个人免费图床

文章目录 一、国内图床比较二、使用Github搭建图床三、PicGo整合Github图床1、下载并安装PicGo2、设置图床3、整合jsDelivr具体配置介绍 4、测试5、附录 四、Typora整合PicGo实现自动上传 每次写博客时&#xff0c;我都会习惯在Typora写好&#xff0c;然后再复制粘贴到对应的网…

2.23日学习总结

今天刚学的01背包&#xff0c;套模板就可以解决这道题。 #include<iostream> using namespace std; int n,m,f[13000],w[3410],v[3410]; int main() {cin>>n>>m;for(int i1;i<n;i)scanf("%d %d",&w[i],&v[i]);for(int i1;i<n;i)for…

第三节:Vben Admin登录对接后端login接口

系列文章目录 第一节&#xff1a;Vben Admin介绍和初次运行 第二节&#xff1a;Vben Admin 登录逻辑梳理和对接后端准备 文章目录 系列文章目录前言一、Flask项目介绍二、使用步骤1.User模型创建2.迁移模型3. Token创建4. 编写蓝图5. 注册蓝图 三. 测试登录总结 前言 上一节&…

1904_ARM Cortex M系列芯片特性小结

1904_ARM Cortex M系列芯片特性小结 全部学习汇总&#xff1a; g_arm_cores: ARM内核的学习笔记 (gitee.com) ARM Cortex M系列的MCU用过好几款了&#xff0c;也涉及到了不同的内核。不过&#xff0c;关于这些内核的基本的特性还是有些不了解。从ARM的官方网站上找来了一个对比…

皓学IT:WEB05-Servlet

一、Servlet 1.1.概述 Servlet是SUN公司提供的一套规范&#xff0c;名称就叫Servlet规范&#xff0c;它也是JavaEE规范之一。我们可以像学习Java基础一样&#xff0c;通过API来学习Servlet。这里需要注意的是&#xff0c;在我们之前JDK的API中是没有Servlet规范的相关内容&am…

k8s笔记26--快速实现prometheus监控harbor

k8s笔记26--快速实现prometheus监控harbor 简介采集指标&配置grafana面板采集指标配置grafana面板 说明 简介 harbor是当前最流行的开源容器镜像仓库项目&#xff0c;被大量IT团队广泛应用于生产、测试环境的项目中。本文基于Harbor、Prometheus、Grafana介绍快速实现监控…