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.mzph.cn/diannao/61198.shtml

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

相关文章

《设计模式》创建型模式总结

目录 创建型模式概述 Factory Method: 唯一的类创建型模式 Abstract Factory Builder模式 Prototype模式 Singleton模式 最近在参与一个量化交易系统的项目&#xff0c;里面涉及到用java来重构部分vnpy的开源框架&#xff0c;因为是框架的搭建&#xff0c;所以会涉及到像…

c++类对象练习

#include <iostream> #include <cstring>using namespace std;class mystring {char* buf; public:mystring(); //构造函数mystring(const char* str); //构造函数void show(); //输出函数void setmystr(const mystring str); //设置函数const char* getmystr() co…

CH03_反射

第3章&#xff1a;反射 本章目标 掌握反射的原理 熟悉反射的基本运用 本章内容 反射是什么 C# 编译运行过程 首先我们在VS点击编译的时候&#xff0c;就会将C#源代码编译成程序集 程序集以可执行文件 (.exe) 或动态链接库文件 (.dll) 的形式实现 程序集中包含有Microsoft …

多品牌摄像机视频平台EasyCVR视频融合平台+应急布控球:打造城市安全监控新体系

在当今快速发展的智慧城市和数字化转型浪潮中&#xff0c;视频监控技术已成为提升公共安全、优化城市管理、增强应急响应能力的重要工具。EasyCVR视频监控平台以其强大的多协议接入能力和多样化的视频流格式分发功能&#xff0c;为用户提供了一个全面、灵活、高效的视频监控解决…

深入理解 Maven 生命周期与常用命令:从编译到安装

Maven 是 Java 项目管理中不可或缺的工具之一&#xff0c;其核心功能包括依赖管理、项目构建和发布等。本文将围绕 Maven 的生命周期及常用命令&#xff0c;解析从项目编译到安装的完整流程&#xff0c;并结合实际案例帮助读者更好地掌握 Maven 的使用。 1. Maven 生命周期概述…

数据结构 (3)线性表的概念及其抽象数据类型定义

一、线性表的概念 定义&#xff1a;线性表是指具有相同数据类型的n个数据元素的有限序列。可以表示为L(a1,a2,…,ai,…,an)&#xff0c;其中a1是第一个元素&#xff0c;称为表头&#xff1b;an是最后一个元素&#xff0c;称为表尾。 特点&#xff1a; 有序性&#xff1a;线性表…

Java基础——继承和多态

目录 一、继承 继承的定义&#xff1a; 继承的基本用法&#xff1a; 如何调用父类的方法&#xff1f; 二、多态 多态性的好处 多态中的强制类型转换&#xff1a; 包的命名规则——域名倒叙 一、继承 继承的定义&#xff1a; 继承是面向对象编程中的一种机制&#xff0c…

【Zookeeper】一、Zookeeper的使命

摩尔定律揭示了集成电路每18个月计算性能就会增加一倍。 Zookeeper以Fast Paxos算法为基础。 在一个大型应用中&#xff0c;经常会按照功能边界将应用分为多个模块&#xff0c;这些模块可以分别独立部署。而要完成某一项具体的功能&#xff0c;不能仅靠其中一个模块&#xff…

vue3中父div设置display flex,2个子div重叠

在Vue 3中&#xff0c;若要设置父div使用flex布局并且使得2个子div重叠&#xff0c;可以在父div上使用样式display: flex以及position: relative&#xff0c;然后在子div上使用position: absolute来定位。 <template><div class"parent"><div class&…

Elasticsearch面试内容整理-分析与映射

在 Elasticsearch 中,分析(Analysis)和映射(Mapping)是数据处理和存储的核心部分。它们共同决定了数据如何被解析、存储以及如何被有效地搜索和查询。以下是关于分析和映射的详细介绍。 分析(Analysis) 分析是将文本数据转换为可以被 Elasticsearch 搜索的索引格式的过程…

播放器开发之ffmpeg 硬件解码方案

硬件编解码的概念 硬件编解码是⾮CPU通过烧写运⾏视频加速功能对⾼清视频流进⾏编解码&#xff0c;其中⾮CPU可包括GPU、FPGA或者 ASIC等独⽴硬件模块&#xff0c;把CPU⾼使⽤率的视频解码⼯作从CPU⾥分离出来&#xff0c;降低CPU的使⽤负荷&#xff0c;使得平台能 ⾼效且流畅…

Go 编译代码-分平台编译

要针对 Mac, Linux, 和 Windows 编译单个 main.go 文件&#xff0c;可以使用 Go 的交叉编译功能&#xff0c;通过设置环境变量 GOOS 和 GOARCH 来指定目标操作系统和架构。 编译命令 在项目目录下执行以下命令&#xff1a; 1. MacOS 编译 GOOSdarwin GOARCHamd64 go build …

使用Python和OpenCV连接并处理IP摄像头视频流

使用Python和OpenCV连接并处理IP摄像头视频流 随着智能设备的发展&#xff0c;越来越多的家庭和企业开始使用IP摄像头进行安全监控或远程查看。这些摄像头通常可以通过网络访问&#xff0c;提供了丰富的功能&#xff0c;如实时视频流、云台控制等。本文将详细介绍如何利用Pyth…

计算机毕业设计SparkStreaming+Kafka旅游推荐系统 旅游景点客流量预测 旅游可视化 旅游大数据 Hive数据仓库 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【C#】面向对象:矩形类计算周长和面积

文章目录 一、矩形类的设计与实现1.1 矩形类的属性1.2 矩形类的构造函数1.3 矩形类的方法1.4 代码实现1.4.1 运行 一、矩形类的设计与实现 题目&#xff1a;编写一个矩形类&#xff0c;私有数据成员为举行的长(Len)和宽(Wid)&#xff0c;无参构造函数将len和wid设置为0&#x…

上海市计算机学会竞赛平台2024年11月月赛丙组考勤系统

题目描述 在 Carol 的办公楼的入口处有一套刷卡系统&#xff0c;每个员工都有一张唯一的身份卡&#xff0c;他们每次进出大楼都要刷卡&#xff0c;而系统会依次记录每次刷卡的员工编号&#xff0c;员工和他的编号一一对应&#xff0c;且在一天内一共有 nn 次刷卡记录。 一个员…

【PyTorch][chapter 28] 揭秘 Transformer:缩放定律指南

概括 我们介绍了 LLM 的各种缩放定律&#xff0c;研究了模型损失如何随着训练数据和参数数量的增加而变化。讨论包括对用于解释 LLM 缩放定律的 IsoLoss 轮廓和 IsoFLOPs 切片的解释&#xff0c;从而为优化计算资源提供了见解。 最后&#xff0c;我们讨论了 FLOP 和 FLOPS 的概…

Android上运行Opencv(TODO)

在高通安卓平台上&#xff0c;确实可以通过 NDK 使用 OpenCV 并访问摄像头。NDK 提供了更高性能的计算能力&#xff0c;特别是在图像处理和计算密集型任务中&#xff0c;与 OpenCV 结合可以充分利用高通平台的硬件资源&#xff08;如 NEON SIMD 指令集和 GPU 加速&#xff09;。…

【GNU】gcc -g编译选项 -g0 -g1 -g2 -g3 -gdwarf

1、gcc -g的作用 GCC 的 -g 选项用于在编译时生成调试信息&#xff0c;这些信息会嵌入到生成的目标文件或可执行文件中&#xff0c;主要目的是为了支持调试器&#xff08;如 gdb&#xff09;对程序的调试工作。 1.1 生成调试信息 当你在编译代码时使用 -g 选项&#xff0c;GCC…

【课堂笔记】隐私计算实训营第四期:隐私求交PSI

隐私计算实训营第四期&#xff1a;隐私求交PSI 安全求交集&#xff08;PSI&#xff09;定义PSI功能和分类最基础的PSI&#xff1a;Two-Party Semi-Honest PSI如何设计Two-Party Semi-Honest PSI方法1&#xff1a;一个基于Hash的PSI方法2&#xff1a;基于Diffie-Hellman密钥交换…