C#泛型:高级静态语言的效率利器
文章目录
- 引入
- 类型约束
- 子类泛型
- 常用的泛型数据结构
前文提要:
- 💎超快速成,零基础掌握C#开发中最重要的概念
- 💎抽丝剥茧,C#面向对象快速上手
- 💎Winform,最友好的桌面GUI框架
- 💎懂了委托,才算真正入门C#
引入
所谓泛型,就是创建一个函数,对所有数据类型都生效。最常见的例子就是运算符,毕竟1+1=2
,1.0+1.0=2.0
,足以看出+
是对多种数据类型起作用的。
但是,如想创建一个函数add(int a, int b)
,那么输入add(1.0, 1.0)
是肯定要报错的,VS直接就给标红了。
泛型的出现,就很好地解决了这个尴尬的问题
T add<T>(T a, T b)
{dynamic d1 = a;dynamic d2 = b;return (T)(d1 + d2);
}Console.WriteLine(add<int>(1, 1));
Console.WriteLine(add<double>(1.0, 1.0));
上面代码中,T
表示某种数据类型,在调用函数add
时,根据add
后面的<>
加以声明。
但如果就此就写return a+b
显然也是不行的,因为+
这种运算符并没有对T
进行重载,编辑器并不会允许两种未知的类型相加。
这个时候就需要用到dynamic
,用来让编辑器放弃类型检查,将任何可能发生的错误都留给运行阶段。
最后,运行结果为
2
2
类型约束
dynamic
用着确实爽,但后果就是责任自负,这玩意要是用在团队协作的场合,简直就是灾难,毕竟并非所有对象都可以驾驭加法。
所以,C#的泛型,是可以被约束的泛型,关键就是where
,将上述代码写为
T add<T>(T a, T b) where T : struct{dynamic d1 = a;dynamic d2 = b;return (T)(d1 + d2);
}
where T : struct
表示T
必须是数值类型的一种,所以编译器的类型检查仍会发挥作用,在调用add
时,如果T
不是数值类型,就会报错。
C#一共有5种约束方案,列表如下
类别 | 条件 |
---|---|
struct | T必须是值类型 |
class | T必须是引用类型 |
new() | T必须有无参数的构造函数 |
基类名 | T必须是基类或派生自基类 |
接口名 | T必须是指定接口 |
裸类型 |
不同类型的约束,或相同类型不同种类的约束,一般是可以混用的,如果不能混用,编译器会提醒。比如struct
几乎不能和其他类型混用。如果new()
参与了约束,则放在最后。
子类泛型
除了函数可以采用泛型,类当然也可以,不仅可以,而且还能继承。
class MyList<T>
{public T[] a;public MyList(){} //无参数的构造函数,用于继承public MyList(int n){a = new T[n];}public T this[int index]{get => a[index];set => a[index] = value;}}
MyList
相当于是给数组套了一层壳,其构造函数并不存在什么难以理解的地方,唯一有些问题的可能是下面的索引器public T this[int index]
,这种写法可以实现方括号形式的索引。
可以测试一下
var a = new MyList<int>(5);
for (int i = 0; i < 5; i++)
{a[i] = i;Console.WriteLine(a[i]);
}
结果就不粘贴了,接下来新建一个子类
class MyStack<T> : MyList<T>
{public MyStack(int n){a = new T[n];}public T Pop(){T p = a[a.Length- 1];a = a[0..(a.Length-1)];return p;}
}
然后测试一下
var a = new MyStack<int>(3);
for (int i = 0; i < 3; i++)
{a[i] = i;
}for (int i = 0; i < 3; i++)
{Console.WriteLine(a.Pop());
}
结果为
2
1
0
常用的泛型数据结构
C#通过泛型定义了很多数据结构,例如在讲解switch...case
时提到的字典
Dictionary<int, string> card = new Dictionary<int, string>
{{1,"A" },{11, "J" },{12, "Q" },{13, "K" }
};
这种<U, V>
的写法,正是泛型的特点,其中U, V
就是可以随意声明的变量。如果查看字典的类型参数,可以发现其定义方法是这样的
public class Dictionary<TKey, TValue> : ICollection<KeyValuePair<TKey, TValue>>, ... where TKey : notnull
考虑到本节并不是为了将面向对象,所以字典继承的那一大坨类就省略了,关键是where Tkey:notnull
,也就是说,字典对键值对的要求只有一个,就是键不得为null
。
除了字典之外,还有一些常见的数据结构采用了泛型,列表如下,没事儿可以练习练习。
数据结构 | 说明 | 常用方法 |
---|---|---|
List<T> | 泛型列表 | Add, Remove, RemoveAt |
LinkedList<T> | 双端链表 | AddFirst, AddLast, RemoveFirst, RemoveLast |
Queue<T> | 先进先出列表 | Enqueue, Dequeue |
Stack<T> | 栈,先进后出 | Push, Pop |
相关文章:
C#泛型:高级静态语言的效率利器
文章目录引入类型约束子类泛型常用的泛型数据结构前文提要: 💎超快速成,零基础掌握C#开发中最重要的概念💎抽丝剥茧,C#面向对象快速上手💎Winform,最友好的桌面GUI框架💎懂了委托&a…...
澳大利亚访问学者申请流程总结
澳大利亚访问学者申请需要注意些什么?下面知识人网小编整理澳大利亚访问学者申请流程总结。1、取得wsk英语成绩,现在都是先买票再上车了。2、联系外导,申请意向接收函(email)。3、向留学基金委CSC提出申请。4、获批后,申请正式邀请…...
cookie和Session的作用和比较
目录 什么是cookie cookie的工作原理 什么是session Session的工作原理 为什么会有session和cookie cookie和session如何配合工作 cookie和Session作用 什么是会话 什么是cookie cookie是web服务器端向我们客户端发送的一块小文件,该文件是干嘛的呢…...
测试员都是背锅侠?测试人员避“锅”攻略,拿走不谢
最近发生了一起生产事故,究其根源,事故本身属于架构或者需求层面需要规避的问题,测试人员的责任其实是非常小的,但实际情况是:相关测试人员因此承担了很大的压力,成为质量问题的“背锅侠”。 实际上&#…...
C++: C++模板<template>
C template content😊前言😁模板💕1、泛型编程😍2、函数模板😒2.1:函数模板概念👌2.2:函数模板的格式😘2.3:函数模板原理😁2.4:函数模…...
chmod命令详解
用法:chmod [选项]… 模式[,模式]… 文件… 或:chmod [选项]… 八进制模式 文件… 或:chmod [选项]… --reference参考文件 文件… Change the mode of each FILE to MODE. With --reference, change the mode of each FILE to that of R…...
状态机设计中的关键技术
⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。 🔥文章和代码已归档至【Github仓库…...
单片机开发---ESP32S3移植NES模拟器(二)
书接上文 《单片机开发—ESP32-S3模块上手》 《单片机开发—ESP32S3移植lvgl触摸屏》 《单片机开发—ESP32S3移植NES模拟器(一)》 暖场视频,小时候称这个为—超级曲线射门!!!!!&am…...
微信小程序nodej‘s+vue警局便民服务管理系统
本文首先介绍了设计的背景与研究目的,其次介绍系统相关技术,重点叙述了系统功能分析以及详细设计,最后总结了系统的开发心得在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括“最多跑一次”微信小程序的网络应用,在外国小程序的使用已经是很普遍的方…...
第18章 MongoDB $type 操作符教程
MongoDB $type 操作符 描述 在本章节中,咱们将继续讨论MongoDB中条件操作符 $type。 $type操作符是基于BSON类型来检索集合中匹配的数据类型,并return 结果。 MongoDB 中可以使用的类型如下表所示: 类型数字备注Double1 String2 Object3…...
【MySQL主从复制】快速配置
本文配置环境Windows和Linux。 windows主 Linux 从 一、主库配置 首先保证Linux和防火墙开启3306端口或关闭防火墙。 登录Mysql管理员账户: GRANT REPLICATION slave,reload,super ON *.* TO root@从库ip地址 IDENtIFIED BY root; flush privileges; 本地的mysql可以被:…...
Typescript - interface 关键字(通俗易懂的详细教程)
前言 简单来说,Interface 就是一种描述对象或函数的东西。 您可以把 interface 理解为形状,真实开发情况下,一个对象需要有什么样的属性,函数需要什么参数或返回什么样的值,数组应该是什么样子的,一个类和继…...
【计组】内存和总线
课程链接:深入浅出计算机组成原理_组成原理_计算机基础-极客时间 一、虚拟内存和内存保护 日常使用的操作系统下,程序不能直接访问物理内存。内存需要被分成固定大小的页(Page),再通过虚拟内存地址(Virtu…...
CUDA中的数学方法
CUDA中的数学方法 文章目录CUDA中的数学方法1. Standard FunctionsSingle-Precision Floating-Point FunctionsDouble-Precision Floating-Point Functions2. Intrinsic FunctionsSingle-Precision Floating-Point FunctionsDouble-Precision Floating-Point Functions参考手册…...
Elasticsearch基本概念和索引原理
一、Elasticsearch是什么? Elasticsearch是一个基于文档的NoSQL数据库,是一个分布式、RESTful风格的搜索和数据分析引擎,同时也是Elastic Stack的核心,集中存储数据。Elasticsearch、Logstash、Kibana经常被用作日志分析系统&…...
《NFL橄榄球》:堪萨斯城酋长·橄榄1号位
堪萨斯城酋长队(Kansas City Chiefs)是位于密苏里州堪萨斯城的职业美式橄榄球队;目前在全国橄榄球联盟隶属于美国橄榄球联合会(AFC)西区;其夏季训练营在威斯康星大学河瀑校区举行。 酋长队的前身是达拉斯得州佬队,这支…...
python+django在线教学网上授课系统vue
随着科技的进步,互联网已经开始慢慢渗透到我们的生活和学习中,并且在各个领域占据着越来越重要的部分,很多传统的行业都将面临着巨大的挑战,包括学习也不例外。现在学习竞争越来越激烈,人才的需求量越来越大࿰…...
二叉搜索树之AVL树
AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年 发明了一种解决上…...
全栈自动化测试技术笔记(二):准备工作的切入点
自动化测试技术笔记(二):准备工作的切入点 上篇整理的技术笔记,聊了自动化测试的前期调研工作如何开展,最后一部分也提到了工作的优先级区分。 这篇文章,接上篇文章的内容,来聊聊自动化测试前期的准备工作࿰…...
57 长短期记忆网络(LSTM)【动手学深度学习v2】
57 长短期记忆网络(LSTM)【动手学深度学习v2】 深度学习学习笔记 学习视频:https://www.bilibili.com/video/BV1JU4y1H7PC/?spm_id_fromautoNext&vd_source75dce036dc8244310435eaf03de4e330 长短期记忆网络(LSTM)…...
算法第十五期——动态规划(DP)之各种背包问题
目录 0、背包问题分类 1、 0/1背包简化版 【代码】 2、0/ 1背包的方案数 【思路】 【做法】 【代码】 空间优化1:交替滚动 空间优化2:自我滚动 3、完全背包 【思路】 【代码】 4、分组背包 核心代码 5、多重背包 多重背包解题思路1:转化…...
实现复选框全选和全不选的切换
今天,复看了一下JS的菜鸟教程,发现评论里面都是精华呀!! 看到函数这一节,发现就复选框的全选和全不选功能展开了讨论。我感觉挺有意思的,尝试实现了一下。 1. 全选、全不选,两个按钮ÿ…...
React hooks之useState用法(一)
系列文章目录 学习React已经有很长的一段时间了,今天决定重新回顾一下跟React相关的一些知识点 文章目录系列文章目录结构如下一、hooks是什么?useState可以能做什么二、如何使用useState()第一步:创建【函数组件&…...
spring的简单理解
目录 1 .ioc容器(控制反转) 2. Aop面向切面编程 3. 事务申明 4. 注解的方式启动 5. spring是什么与他的优势 6. 代理设计模式(比如aop) 7. springmvc中相应json数据 8. 使用lombok来进行对代码的简化 9. 使用logback记录…...
Docker调用Intel集显实现FFmpeg硬解码
文章目录Docker调用Intel集显实现FFmpeg硬解码参考FFmpeg 集成qsv方式一 容器完成所有步骤方式二 容器完成部分步骤方式三 dockerfile部署Docker调用Intel集显实现FFmpeg硬解码 参考 ffmpeg_qsv_docker拉取该镜像可以实现FFmpeg集成vaapi的硬加速,通过dockerfile文…...
端到端模型(end-to-end)与非端到端模型
一、端到端(end to end) 从输入端到输出端会得到一个预测结果,将预测结果和真实结果进行比较得到误差,将误差反向传播到网络的各个层之中,调整网络的权重和参数直到模型收敛或者达到预期的效果为止,中间所…...
uniApp封装一个滑块组件
最近 项目中有一个需求 PC端动态设计的表单 移动端要能渲染出来 那么 就要去找到对应的组件 而其中 没有的 就包括滑块 没有又能怎么办 只能自己封装一个 我们直接上代码 <template><view class"u-slider" tap"onClick" :class"[disabled…...
运动基元(二):贝塞尔曲线
贝塞尔曲线是我第一个深入接触并使用于路径规划的运动基元。N阶贝塞尔曲线具有很多优良的特性,例如端点性、N阶可导性、对称性、曲率连续性、凸包性、几何不变性、仿射不变性以及变差缩减性。本章主要介绍贝塞尔曲线用于运动基元时几个特别有用的特性。 一、贝塞尔曲线的定义 …...
Android 11.0 关于Launcher3中调用截图功能总是返回null的解决方案
1.1概述 在11.0的系统产品开发中,在某些时候需要调用截图接口来进行截屏功能实现,而在Launcher3中发现调用系统截屏接口SurfaceControl.screenshot进行截图的时候始终为null, 获取不到系统当前页面的截屏功能,所以需要找到当前截屏失败的原因然后来实现截屏功能的实现,下面来…...
random随机数
random随机数 1.概述 random用来生成一些随机数,下面介绍random模块提供的方法根据需求生成不同的随机数。 2.random常用操作 2.1.random默认随机数 random()函数返回一个随机的浮点值,默认返回值范围在0 < n < 1.0区间 import randomfor i …...
连接国外网站做端口映射/百度的人工客服
Biotin-PEG-NH2 生物素-聚乙二醇-氨基 英文名称:Biotin-PEG-Amine 中文名称:生物素-聚乙二醇-氨基 外观: 白色/灰白色液体、半固体或固体,取决于分子量。 溶剂:水,氯仿,DMSO,二氯甲烷等常规…...
成都哪里有做网站的/bt搜索引擎下载
基于多尺度窗口的DEM局部填洼方法徐静波1,许捍卫1,于艳超2【摘要】为了去除DEM中的伪洼地,使水系提取结果更加精确,在M&V算法的基础上提出了一种改进的填洼方法。用局部处理的思想将填洼步骤简化,减小对DEM的计算范…...
手机端网站制作教程/提升网站权重的方法
原标题: 广西科技大学鹿山学院--土木工程VR实训中心一、项目概述广西科技大学鹿山学院土木工程 VR实训基地中心(以下简称“中心”)主要是对该校土木工程系的土木工程专业进行设计与规划的,中心旨在借助先进的虚拟现实技术,结合土木工程、建筑…...
家纺公司网站模版/电视剧排行榜百度搜索风云榜
JavaScript 实现点击/关闭全屏 思路 那么,问题我们知道了。解决问题的思路是怎么样的呢? 我们获取到图片元素的 DOM 节点 我们调用全屏的函数进行全屏展示 浏览器监听点击事件,当图片是全屏的状态,再次点击图片的时候…...
那个公司做网站好/专注于品牌营销服务
namedtuple的需求: t (“kiosk”, ‘pts/0’, ‘localhost’) info {‘kiosk’ : { ‘name’: “kiosk”, ‘node’: ‘localhost’ }} 为元组的局限性:不能为元组内部的数据进行命名,所以往往我们并不知道一个元组所要表达的意义ÿ…...
连云港网站建设培训学校/百度推广入口登录
标签定义及使用说明 <abbr> 标签用来表示一个缩写词或者首字母缩略词,如"WWW"或者"NATO"。 通过对缩写词语进行标记,您就能够为浏览器、拼写检查程序、翻译系统以及搜索引擎分度器提供有用的信息。 实例 被标记的缩写词如…...