【C#】泛型
【C#】泛型
泛型是什么
泛型是将类型作为参数传递给类、结构、接口和方法,这些参数相当于类型占位符。当我们定义类或方法时使用占位符代替变量类型,真正使用时再具体指定数据类型,以此来达到代码重用目的。
泛型特点
- 提高代码重用性
- 一定程度避免装箱拆箱
泛型分类
声明 泛型类 基本语法:
class 类名<泛型占位字母>
声明 泛型结构 基本语法:
struct 结构名<泛型占位字母>
声明 泛型接口 基本语法:
interface 接口名<泛型占位字母>
声明 泛型函数 基本语法:
函数名<泛型占位字母>(参数列表)
注意:泛型占位字母可以有多个,用逗号分开
代码展示
1. 泛型类
class TestClass<T>
{public T value;
}
class TestClass2<T1, T2, K, J>
{public T1 value1;public T2 value2;public K value3;public J value4;
}
class Program
{static void Main(string[] args){//使用时必须指定具体数据类型,如:int类型TestClass<int> t = new TestClass<int>();t.value = 5;Console.WriteLine(t.value);//输出:5//再创建一个对象,将泛型指定为string类型,这里说明泛型可以提高代码重用性TestClass<string> t2 = new TestClass<string>();t2.value = "123456";Console.WriteLine(t2.value);//输出:123456//创建一个有多个泛型类的对象TestClass2<int, string, bool, TestClass<float>> t3 = new TestClass2<int, string, bool, TestClass<float>>();Console.ReadLine();}
}
2. 泛型结构体
struct TestStruct<T>
{public T value;
}
class Program
{static void Main(string[] args){//创建结构体对象TestStruct<bool> ts = new TestStruct<bool>();Console.WriteLine(ts.value);//输出:FalseConsole.ReadLine();}
}
3. 泛型接口及类继承
interface TestInterface<T>
{T value{get;set;}
}class Test : TestInterface<int>
{private int myValue;public int value {get{return myValue;}set{myValue = value;}}
}
class Program
{static void Main(string[] args){//创建接口实例,Test类是实现 指定泛型为int类型的接口 的类,所以创建接口实例时,泛型指定类型必须与Test类指定的泛型类型一致 即int类型TestInterface<int> it = new Test();it.value = 100;Console.WriteLine(it.value);//输出:100Console.ReadLine();}
}
创建接口实例时,泛型指定类型必须与Test类指定的泛型类型不一致时,会报错。

4. 泛型方法
- 普通类中的泛型方法
class Test2
{//泛型作为参数传递public void TestFun<T>(T value){Console.WriteLine(value);}//泛型作为返回值public T TestFun<T>(bool v){return default(T);}//泛型既不作为参数传递 也不作为返回值public void TestFun<T>(){//用参数类型在里面进行逻辑处理,例如:T t = default(T);//获得类型的默认值方法:default()Console.WriteLine(t);}//多个泛型作为参数传递public void TestFun<T, K, M>(T t, K k, M m){}
}
class Program
{static void Main(string[] args){//创建Test2对象Test2 tt = new Test2();tt.TestFun<float>(12.5f);//作为参数传递时 输出:12.5tt.TestFun<string>(true);//作为返回值tt.TestFun<int>();//既不作为参数传递 也不作为返回值 输出:0tt.TestFun<int, double, bool>(1, 8.888888, false);//多个作为参数传递Console.ReadLine();}
}
- 泛型类中的泛型方法
//Test2 与 Test2<T> 名字一样但是后者有泛型,就相当于新的类,两个类是不一样的
class Test2<T>
{public T value;//这个不叫泛型方法 因为 T是泛型类声明的时候 就指定的 在使用这个函数的时候 不能进行动态变化public void TestFun(T t){Console.WriteLine("No :" + t);}//这个才是泛型方法 一直是方法名后面加了尖括号并且有占位符public void TestFun<K>(K k){Console.WriteLine("YES :" + k);}
}class Program
{static void Main(string[] args){Test2<int> tt2 = new Test2<int>();//这两个不是同一个方法tt2.TestFun(156);//输出:No :156tt2.TestFun<int>(156);//输出:YES :156//这两个同一个方法tt2.TestFun<string>("123");//输出:YES :123tt2.TestFun("789");//输出:YES :789}
}
tt2.TestFun(156); 与 tt2.TestFun(156); 调用的方法如下:

tt2.TestFun(“123”); 与 tt2.TestFun(“789”); 调用的方法如下:

【tt2】是一个泛型为【int类型】的【Test2】对象,使用tt2.TestFun()方法时,传入的参数与对象的泛型一致时,则会调用【public void TestFun(T t)】。传入的参数与对象的泛型不一致时,则会调用同名的泛型方法【public void TestFun<K>(K k)】,且调用时可以省略尖括号【<>】,通过参数直接判断该方法的泛型数据类型。
小结
- 声明泛型时,就是一个任意类型的占位符,真正起作用是在使用它时。
- 泛型占位符至少有一个,可以有无数个,多个时用逗号分隔开。
- 文章提到的default目的是用来获取任意类型的默认值的。
因为作者精力有限,文章中难免出现一些错漏,敬请广大专家和网友批评、指正。
相关文章:
【C#】泛型
【C#】泛型 泛型是什么 泛型是将类型作为参数传递给类、结构、接口和方法,这些参数相当于类型占位符。当我们定义类或方法时使用占位符代替变量类型,真正使用时再具体指定数据类型,以此来达到代码重用目的。 泛型特点 提高代码重用性一定…...
CLIP:连接文本-图像
Contrastive Language-Image Pre-Training CLIP的主要目标是通过对比学习,学习匹配图像和文本。CLIP最主要的作用:可以将文本和图像表征映射到同一个表示空间 这是通过训练模型来预测哪个图像属于给定的文本,反之亦然。在训练过程中&#…...
MFC网络编程简单例程
目录 一、关于网络的部分概念1 URL(网址)及URL的解析2 URL的解析3 域名及域名解析3 IP及子网掩码4 什么是Web服务器5 HTTP的基本概念6 Socket库概念7 协议栈8 Socket库收发数据基本步骤 二、基于TCP的网络应用程序三、基于UDP的网络应用程序 一、关于网络的部分概念 1 URL(网址…...
云原生简介 (Cloud Native)
云原生(cloud Native) 云原生的概念诞生于10年前,netflix 在 AWS 上的一次演讲中。有趣的是当初没有明确的定义,现在也没有明确的定义,对不同的人来说,有不同的概念。 概念 云原生:是在云上构…...
【SpringBoot系列】 测试框架之@SpringBootTest的使用
SpringBootTest的详细介绍 SpringBootTest 是 Spring Boot 测试框架中的注解,用于标识一个测试类,以指示该类是一个 Spring Boot 应用程序的测试类。它允许你在测试环境中加载整个 Spring Boot 应用程序上下文,测试应用程序的各种组件、服务…...
【数据结构与算法篇】手撕八大排序算法之交换排序
👻内容专栏: 《数据结构与算法篇》 🐨本文概括:常见交换排序包括冒泡排序与快速排序,本篇讲述冒泡排序与快速排序的思想及实现、复杂度分析。 🐼本文作者: 花 蝶 🐸发布时间&#…...
ArcGIS Pro实践技术应用、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合
GIS是利用电子计算机及其外部设备,采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲,它是在一定的地域内,将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来,达到对地理和属性信息的综合管理。GIS的…...
uniapp 项目实践总结(一)uniapp 框架知识总结
导语:最近开发了一个基于 uniapp 框架的项目,有一些感触和体会,所以想记录以下一些技术和经验,在这里做一个系列总结,算是对自己做一个交代吧。 目录 简介全局文件全局组件常用 API条件编译插件开发 简介 uniapp 是…...
Oracle查看与修改隐藏参数
Oracle查看与修改隐藏参数 查看隐藏参数修改隐藏参数 查看隐藏参数 查看数据库中所有的隐藏参数: SELECT a.ksppinm "Parameter", b.KSPPSTDF "Default Value",b.ksppstvl "Session Value", c.ksppstvl "Instance Value"…...
基于MQTT协议的物联网网关实现远程数据采集及监控
在数字化时代的浪潮中,工业界正面临着前所未有的变革与机遇。而在这场变革中,基于MQTT协议的物联网网关崭露头角,成为连接工业设备、实现远程数据采集与监控的利器。其中,HiWoo Box作为一款出色的工业边缘网关,引领着这…...
服务内部错误: stderr: bash: docker-compose: 未找到命令
报错描述 1Panel在应用商店安装软件失败,重建或者重启报错"服务内部错误: stderr: bash: docker-compose: 未找到命令" 执行命令"docker-compose --version"结果为"Docker Compose version v2.17.2",说明docker-compose已…...
自然语言处理(六):词的相似性和类比任务
词的相似性和类比任务 在前面的章节中,我们在一个小的数据集上训练了一个word2vec模型,并使用它为一个输入词寻找语义相似的词。实际上,在大型语料库上预先训练的词向量可以应用于下游的自然语言处理任务,为了直观地演示大型语料…...
安防监控视频平台EasyCVR视频汇聚平台定制项目增加AI智能算法详细介绍
安防视频集中存储EasyCVR视频汇聚平台,可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等功能。为了便…...
VB个人邮件处理系统设计与实现
简述 当今世界电子邮件已经是网络生活中不可或缺的,相信每个认知网络的人都会有一个或多个自己的电子邮箱,人们通过电子邮件进行通信和交流,许多商家和组织机构也用电子邮件进行各种商业活动和业务联系,毫无疑问,电子邮件已经逐渐开始取代普通的信件,成为为主流的信件交流…...
第一章辩证唯物论,考点七思维导图
逻辑框架 考点七思维导图:...
Python入门教程 - 基本函数(四)
目录 一、什么是函数 二、自定义函数并使用它 一、什么是函数 前面我们学习了像input()、print()、type()等等,他们都是函数。这些其实是由Python内部帮我们定义好的。我们直接用就可以了。 关于函数,除了用内部定义好的,我们也可以自己定…...
[PyTorch][chapter 53][Auto Encoder 实战]
前言: 结合手写数字识别的例子,实现以下AutoEncoder ae.py: 实现autoEncoder 网络 main.py: 加载手写数字数据集,以及训练,验证,测试网络。 左图:原图像 右图:重构图像 ----main----- 每轮训…...
Springboot常用方法参数注解及示例
文章目录 Springboot常用方法参数注解及示例一、RequestParam: 从URL查询参数中提取数据。二、PathVariable: 从URL路径中提取数据。三、RequestBody: 从请求体中提取数据,并映射到对象。四、RequestHeader: 从请求头中…...
基于java+springboot+vue的交流互动系统-lw
系统介绍: 随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多企业的之中,随之就产生了“交流互动系统”,这样就让交流互动系统更加方便简单。 对于本交流互动系统的设计来说&a…...
使用candump+grep查看CAN报文
在Linux系统中观察看CAN报文,我们一般使用candump,但是有时候会发现总线上CAN报文太多,例如开启了好几个PDO,这就导致想看的报文被夹杂到报文的海洋里,然后再去找,非常麻烦。 candump也提供了只观察某个报…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
