CH02_泛型

第2章:泛型


本章目标

  1. 理解泛型的概念

  2. 掌握泛型方法的定义与使用

  3. 掌握泛型类的定义与使用

  4. 掌握泛型接口的定义与使用

本章内容

泛型的概念

​ 泛型(generic)是C# 2.0推出的新语法,并不是语法糖,它是专门为处理多段代码在不同的数据类型上执行相同的指令的情况而设计的。 即泛型让不同的数据类型支持相同的业务逻辑。

​ 泛型是一个复合类型,把多个类型混合一起作用, 在C#中应用比较广的泛型:泛型方法,泛型类,泛型接口

泛型方法

泛型方法:调用时泛型参数类型可以省略

泛型定义时,是延迟声明的:即定义的时候没有指定具体的参数类型,把参数类型的声明推迟到了调用的时候才指定参数类型。

   		/// <summary>/// 泛型方法/// 求和/// </summary>/// <typeparam name="T"></typeparam>/// <param name="t1"></param>/// <param name="t2"></param>/// <returns></returns>static object Fun1<T>(T t1,T t2){return Convert.ToDouble(t1) + Convert.ToDouble(t2);}/// <summary>/// 泛型方法/// 比较大小/// </summary>/// <typeparam name="T"></typeparam>/// <param name="t1"></param>/// <param name="t2"></param>/// <returns></returns>static T Fun2<T>(T t1, T t2){double n1 = Convert.ToDouble(t1);double n2 = Convert.ToDouble(t2);return n1 > n2 ? t1 : t2;}
	#region 测试泛型方法Fun1(23, 15);Fun1<int>(23, 15);Fun2(23.5, 18.9);Fun2<double>(23.5, 18.9);#endregion

泛型类

泛型类定义:在类名后

泛型类的作用域:整个类中

/// <summary>/// 泛型类/// </summary>/// <typeparam name="T"></typeparam>public class MyArray<T>{T[] data;int size;public int Size { get => size; set => size = value; }public MyArray(){this.data=new T[10];}/// <summary>/// 添加/// </summary>/// <param name="item"></param>public void Add(T item){//栈满扩容if (this.data.Length==this.Size){this.AutoExpand();}this.data[Size++] = item;}/// <summary>/// 索引器/// </summary>/// <param name="index"></param>/// <returns></returns>public T this[int index]{get{return this.data[index];}set{this.data[index] = value;}}/// <summary>/// 自动扩容/// </summary>private void AutoExpand(){T[] newData = new T[this.data.Length*2];for (int i = 0; i < this.data.Length; i++){newData[i] = this.data[i];}this.data = newData;}}
#region 测试泛型类MyArray<int> myArray = new MyArray<int>();myArray.Add(13);myArray.Add(24);myArray.Add(55);myArray[1] = 100;for (int i = 0; i < myArray.Size; i++){Console.WriteLine(myArray[i]);}#endregion

泛型接口

泛型接口和泛型类定义方式一样,在接口名称后使用未知类型

只是方法签名,没有方法体,默认是公开的,不能添加修改符

/// <summary>/// 泛型接口/// </summary>/// <typeparam name="T"></typeparam>public interface MyInterface<T>{void Service(T t1, T t2);}/// <summary>/// 实现泛型接口的类/// </summary>public class MyClass1 : MyInterface<double>{public void Service(double t1, double t2){Console.WriteLine(t1+ t2);}}/// <summary>/// 实现泛型接口的类/// </summary>/// <typeparam name="T"></typeparam>public class MyClass2<T> : MyInterface<T>{public void Service(T t1, T t2){Console.WriteLine(Convert.ToDouble(t1)+Convert.ToDouble(t2));}}
#region 测试泛型接口MyInterface<double> my1 = new MyClass1();MyInterface<int> my2 = new MyClass2<int>();my1.Service(2.3, 4.5);my2.Service(23,45);#endregion

本章总结

课后作业

1.在指定索引位置插入数据
1.检查索引的有效性
2.将索引位置到最后一个位置的所有元素向后平移一位(从最后一个元素开始)
3.将新数据插入到指定索引的位置
4.更新容器大小
2.移除首个元素
1.检查容器是否为空
2.将所以为1到末尾的所有元素向前平移一位(从索引为1的元素开始)
3.末尾清空
4.更新容器大小
3.移除尾个元素
1.检查容器是否为空
2.清空末尾
3.更新容器大小
4.移除指定索引的元素
1.检查索引的有效性
2.判断首尾元素,调用相应方法完成
3.将索引其后的所有元素向前平移一位
4.末尾清空
5.更新容器大小

5:泛型接口应用
1.定义泛型接口 IValidate<T>,包含数据验证的方法Check(T item);
2.定义实现类:
CheckName类实现接口,完成验证。(2-6个字)
CheckAge类实现接口,完成验证。(1-120)
CheckSex类实现接口,完成验证。(男或女)
3.编写测试类,完成验证功能
public bool CheckData( IValidate interface,T data){

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

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

相关文章

STM32设计学生宿舍监测控制系统-分享

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 本项目旨在利用STM32单片机为核心&#xff0c;结合传感器技术、无线通信技…

英伟达 Isaac Sim仿真平台体验

一、产品名称及版本 Isaac Sim 是由 NVIDIA 开发的一款基于物理模拟的机器人仿真平台&#xff0c;旨在为机器人开发者和研究人员提供一个高效、真实的仿真环境。Isaac Sim 基于 NVIDIA 的 Omniverse 平台&#xff0c;结合了强大的图形渲染、物理引擎和深度学习能力&#xff0c;…

利用寄存器方式,点亮led3最小板

作业:利用寄存器方式,点亮led3小灯 1.通过观察原理图, led3, 是PA8, 一段接3.3v, 一端接io口, 所以PA8端口输出低电平, 就可以让小灯点亮了 2.利用keil创建最小工程 点击跳转博客 3.按照库函数的配置方式 #include "stdint.h" #include "stm32f10x.h" …

Helius:从数据出发,衡量 Solana 的真实去中心化程度

撰文&#xff1a;Lostin&#xff0c;Helius 编译&#xff1a;Yangz&#xff0c;Techub News 摘要 截至 Epoch 685&#xff0c;Solana 有 4514 个节点&#xff0c;包括 1414 个验证者和 3100 个 RPC。没有哪个验证者控制的质押份额超过 3.2%。 中本聪系数&#xff08;NC&#…

SpringBoot 增量部署发布(第2版)

一、背景介绍 书接上一篇《SpringBoot 增量部署发布_springboot增量部署-CSDN博客》&#xff0c;上一篇内容实现了将静态资源与jar分离&#xff0c;但是即使是打包成**-exec.jar&#xff0c;解压jar文件&#xff0c;可以看到里面包含了static&#xff0c;resource目录&#xf…

一篇保姆式centos/ubantu安装docker

前言&#xff1a; 本章节分别演示centos虚拟机&#xff0c;ubantu虚拟机进行安装docker。 上一篇介绍&#xff1a;docker一键部署springboot项目 一&#xff1a;centos 1.卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest doc…

结构体的深入学习:内存对齐等

结构体的创建 //结构体类型的定义//学生 struct Stu {//学生的相关属性char name[20];int age; };结构体变量的创建 struct Stu {//学生的相关属性char name[20];int age; }s1, s2;//s1&#xff0c;s2全局变量int main() {struct Stu s3;//s3是局部变量return 0; }匿名结构体…

QString 转 char*问题与方法(const_cast的使用问题)

1、背景:今天有QString的变量&#xff0c;将QString的值传递给void func(char * ptr)&#xff0c;于是就有了类似下面这一段离谱的代码 当时我还在想为什么var的值为空了&#xff0c;为什么呢。 2、原因:就是因为右边函数返回的是一个临时指针对象&#xff0c;给到了右边&…

【Redis】Redis实现的消息队列

一、用list实现【这是数据类型所以支持持久化】 消息基于redis存储不会因为受jvm内存上限的限制&#xff0c;支持消息的有序性&#xff0c;基于redis的持久化机制&#xff0c;只支持单一消费者订阅&#xff0c;无法避免消息丢失。 二、用PubSub【这不是数据类型&#xff0c;是…

PHP开发全新UI多语言多商户跨境商城源码、支持一键铺货、一键下单

商家可在平台产品库选品&#xff0c;一键铺货到自己商店&#xff0c;用户下单后&#xff0c;商家提交订单给平台&#xff0c;扣除商家供货价所需余额&#xff0c;提交后由平台发货&#xff0c;收货后订单金额结算给商家. 源码开源完整&#xff0c;一切能跑通的逻辑流程都可以二…

Matlab实现北方苍鹰优化算法优化随机森林算法模型 (NGO-RF)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 北方苍鹰优化算法&#xff08;Northern Goshawk Optimization, NGO&#xff09;是一种新颖的群智能优化算法&#xff0c;灵感源自北方苍鹰捕食时的策略。该算法通过模拟苍鹰的搜寻、接近和捕捉猎物的行为模式&am…

【TQ2440】01 ADS1.2 安装

TQ2440是一款基于Samsung S3C2440处理器的ARM9开发板&#xff0c;广泛应用于嵌入式系统学习和开发 TQ2440 开发配套资料 https://pan.baidu.com/s/1cMMK9HQdq1Ou8-K9fnw-DA?pwd5y5r ADS1.2安装包链接&#xff1a;https://pan.baidu.com/s/1BBJb4jYKLOYXIMD86WCycA?pwdf7zr 1、…

不完全微分PID控制算法

不完全微分PID控制算法是一种改进的PID控制方法&#xff0c;主要针对PID控制中的微分环节对高频噪声敏感的问题。通过对微分项进行优化和改造&#xff0c;减少其对噪声的放大作用&#xff0c;同时保留对系统动态变化的响应能力。 不完全微分PID控制原理 不完全微分的核心思想是…

IntelliJ IDEA常用快捷键

文章目录 环境快捷键外观编辑移动光标提示查找Live Templates列操作调试运行 环境 Ubuntu 24.04.1IntelliJ IDEA 2024.1.6 快捷键 外观 Alt 1&#xff1a;打开/关闭“项目”窗口&#xff08;即左边的导航窗口&#xff09; Alt 4&#xff1a;打开/关闭“运行”窗口 Alt …

标题gitLab如何打标签

标题gitLab打标签 1、首先进入到项目里面&#xff0c;找到Repository下的Tages&#xff0c;点击进入 如果是还没有创建过标签&#xff0c;会提示如何用命令创建 git tag -a v1.4 -m "version 1.4"2、也可以直接在界面创建&#xff0c;点击new Tag按钮 3、填写标签…

C++AVL平衡树

1.AVL平衡树节点定义 每一个节点都配左右孩子和父节点&#xff0c;以及平衡因子和其所对应的值。 template<class K, class V> struct AVLTreeNode {// 需要parent指针&#xff0c;后续更新平衡因子可以看到pair<K, V> _kv;AVLTreeNode<K, V>* _left;AVLTr…

Java进阶四-异常,File

异常 概念&#xff1a;代表程序出现的问题。 目的&#xff1a;程序出现了异常我们应该如何处理。 最高父类&#xff1a;Exception 异常分为两类 编译时异常&#xff1a;没有继承RuntimeException的异常,直接继承与Exception,编译阶段就会错误提示。运行时异常:RuntimeExc…

向量数据库FAISS之四:向量检索和 FAISS

来自 YouTube 1.相似度搜索的传统方法(Jaccard, w-shingling, Levenshtein) 1.Jaccard 距离 公式 Jaccard ( A , B ) 1 − ∣ A ∩ B ∣ ∣ A ∪ B ∣ \text{Jaccard}(A, B) 1 - \frac{|A \cap B|}{|A \cup B|} Jaccard(A,B)1−∣A∪B∣∣A∩B∣​ 其中&#xff0c; A 和 …

Stata17最新保姆级安装教程【附安装包】

文章目录 Stata介绍 Stata下载 Stata安装步骤 Stata介绍 Stata 是一套提供其使用者数据分析、数据管理以及绘制专业图表的完整及整合性统计软件。它提供许许多多功能&#xff0c;包含线性混合模型、均衡重复反复及多项式普罗比模式等。 Stata下载 Stata 64位下载链接&…

jenkins离线安装插件

Jenkins 在线安装插件失败 报错&#xff1a; Caused: java.io.IOException: Failed to load https://updates.jenkins.io/download/plugins/login-theme/244.vd67c77f0c4c8/login-theme.hpi to /var/jenkins_home/plugins/login-theme.jpi.tmpat hudson.model.UpdateCenter$Up…