【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也提供了只观察某个报…...
P1311 选择客栈【洛谷算法习题】
P1311 选择客栈 网页链接 P1311 选择客栈 题目描述 丽江河边有 nnn 家很有特色的客栈,客栈按照其位置顺序从 111 到 nnn 编号。每家客栈都按照某一种色调进行装饰(总共 kkk 种,用整数 0∼k−10 \sim k-10∼k−1 表示)&#x…...
为ClaudeCode配置Taotoken作为稳定后备API服务避免中断
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为ClaudeCode配置Taotoken作为稳定后备API服务避免中断 基础教程类,针对担心Claude Code服务不稳定或配额不足的用户&a…...
AI智能体Skills设计:从API工具到核心能力的工程实践
1. 从“工具”到“能力”:重新理解AI智能体的Skills最近和几个做AI应用开发的朋友聊天,发现一个挺有意思的现象:大家一提到给智能体加“Skills”,第一反应往往是去翻看官方文档,找那个叫“Tools”或者“Functions”的列…...
AR眼镜主板与光机定制开发:从核心需求到软硬件协同的工程实践
1. 项目概述:从“主板”与“光机”看AR眼镜的核心最近和几个做AR硬件和方案的朋友聊得比较多,大家普遍有个感觉:市面上关于AR眼镜的讨论,要么是概念满天飞,要么是成品评测,但真正深入到硬件底层,…...
体验分钟级接入为网站原型注入AI能力
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 体验分钟级接入为网站原型注入AI能力 在验证一个网站创意原型时,能否快速为其注入智能对话能力,往往决定了…...
显卡驱动清理终极指南:DDU完整教程与深度解析
显卡驱动清理终极指南:DDU完整教程与深度解析 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller 显卡…...
别再瞎写抽奖了!从原神保底到洗牌算法,5种实战模型帮你搞定游戏概率设计
游戏抽奖系统设计实战:从概率模型到商业落地的5种解决方案 当玩家在《原神》中第89次抽卡仍未获得五星角色时,心跳加速的瞬间背后是精密的数学计算与商业逻辑的完美结合。抽奖系统作为现代游戏的核心付费点,其设计质量直接影响玩家留存、付费…...
揭秘PSLab Web App硬件交互机制:functionList与硬件Handler工作原理
揭秘PSLab Web App硬件交互机制:functionList与硬件Handler工作原理 【免费下载链接】pslab-webapp-legacy PSLab Web App https://pslab.io 项目地址: https://gitcode.com/gh_mirrors/ps/pslab-webapp-legacy PSLab Web App是一款强大的开源硬件交互工具&a…...
如何用嘎嘎降AI处理金融学论文:金融学毕业论文降AI免费完整操作教程
如何用嘎嘎降AI处理金融学论文:金融学毕业论文降AI免费完整操作教程 这篇教程是针对金融学论文降AI教程写的——问得最多的操作细节,都在这里。 主工具:嘎嘎降AI(www.aigcleaner.com),4.8元一篇ÿ…...
