C# 泛型概念及用法详解
C# 泛型概念及用法详解一定义泛型是 C# 的一种语言特性允许在定义类、接口、方法、委托时不指定具体的数据类型而是用一个类型参数Type Parameter来代替等到使用时再指定具体类型。这会大大简化我们的代码结构同时让后期维护变得容易。废话一大堆那么泛型到底长啥样看到下面代码中的 “T” 没有那就是泛型。static void Main(string[] args) { Program program new Program(); program.MyClassMethod(100); program.MyClassMethod2int(100); } public void MyClassMethod(int a) { Console.WriteLine(a); } public void MyClassMethod2T(T a) { Console.WriteLine(a); Console.WriteLine(a.GetType().ToString()); }二为什么要用泛型重载是 “每种类型写一遍”泛型是 “写一遍所有类型通用”类型少的时候重载还行类型多了泛型才是正道 —— 代码复用、维护方便、类型安全。namespace 泛型 { class Program { static void Main(string[] args) { int result Test.Add(3, 4); Console.WriteLine(result); Console.ReadKey(); } } public class Test { public static int Add(int x, int y) { return x y; } public static int Add(string x, string y) { return int.Parse(x) int.Parse(y); } } }那么下面就用泛型的方式来封装一下这个加法运算。注意一下写法在 Add 后面要加上 这句不然会报错。public int AddT(T x, T y) { return 0 ; }三、泛型和 Object 类型的区别下面是一些介绍C# 中Object是一切类型的基类可以用来表示所有类型而泛型是指将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。一句话总结 object 是 “万能盒子”什么都能装但装进去就不知道是什么了用的时候要小心泛型是 “模板盒子”你指定装什么它就装什么编译器帮你盯着不会装错。C# 中泛型是 “通用又安全”一份代码多种类型能用编译器帮你检查类型不用装箱拆箱性能还好。**object缺点**1.因为什么都能装编译器不检查写错了也不报错运行时才崩。​ 2.值类型int、double、结构体装到 object 里要复制到堆上取出来又要复制回 栈上频繁装箱拆箱导致性能损耗。object优点1. object类型可以用来引用任何类型的实例​ 2. object类型可以存储任何类型的值3.可以定义object类型的参数​ 4.可以把object作为返回类型。四、泛型类定义整个类都是泛型的类里的字段、方法都可以用类型参数 T。public class MyListT { private ListT _list new ListT(); public int Count _list.Count; public void Add(T item) { if (item ! null) _list.Add(item); } } // 使用 MyListint intList new MyListint(); intList.Add(1); intList.Add(3); Console.WriteLine(intList.Count); // 2你天天用的List就是泛型类。五泛型类的继承// 方式1子类也是泛型T往下传 public class Test1T { } public class Test2T : Test1T { } // 方式2子类指定父类的具体类型 public class Test1T { } public class Test2T : Test1int { } // 父类T固定为int六、泛型方法**定义**只有方法是泛型的类不一定是泛型的。public class Tool { // 泛型方法只有这个方法用T public static T GetTT(T a) { return a; } }七、泛型接口**定义:**接口也是泛型的。public interface IFaceT { void SayHi(T msg); }两种实现方式// 方式1普通类实现指定具体类型 public class MyClass1 : IFacestring { public void SayHi(string msg) { Console.WriteLine(msg); } } // 方式2泛型类实现T继续往下传 public class MyClass2T : IFaceT { public void SayHi(T msg) { Console.WriteLine(msg); } }八、泛型约束重点什么是泛型约束给类型参数 T 定规矩告诉编译器 T 必须满足什么条件这样方法里才能放心调用 T 的成员。六种约束约束写法含义值类型约束where T : structT 必须是值类型引用类型约束where T : classT 必须是引用类型无参构造约束where T : new()T 必须有无参构造函数基类约束where T : 基类名T 必须是该基类或其子类接口约束where T : 接口名T 必须实现该接口裸类型约束where T : UT 必须是 U 或 U 的子类九约束顺序基类 → 接口 → new()基类放最前面接口放中间new()放最后。多个约束示例public class MyClassT, K, V, W, X, Y where T : struct // T必须是值类型 where K : class // K必须是引用类型 where V : IFaceT // V必须实现IFaceT接口 where W : K // W必须是K或K的子类 where X : class, new() // X必须是引用类型 有无参构造 where Y : MyClass2 // Y必须是MyClass2或其子类 { // ... }十、泛型 反射进阶应用应用场景通用比较两个对象的所有属性值是否相同不用写一堆 if-else。核心思路用反射获取对象的所有属性逐个比较递归处理嵌套对象。public static bool CompareTypeT(T oneT, T twoT) { Type type1 oneT.GetType(); Type type2 twoT.GetType(); if (!type1.Equals(type2)) return false; PropertyInfo[] props1 type1.GetProperties(); PropertyInfo[] props2 type2.GetProperties(); // 遍历所有属性比较 for (int i 0; i props1.Length; i) { object val1 props1[i].GetValue(oneT, null); object val2 props2[i].GetValue(twoT, null); if (!val1.Equals(val2)) return false; } return true; }好处写一个方法所有类型的对象都能比不用每种类型写一遍。十一、一句话速记卡泛型 类型参数化写一遍代码所有类型通用泛型类 整个类都是模板List 就是泛型方法 只有方法是模板泛型接口 接口是模板实现时指定类型泛型委托 委托参数是模板泛型约束 给 T 定规矩struct/class/new ()/ 基类 / 接口vs Object 泛型类型安全、不用装箱、不用强转

相关新闻

【CTF杂项】 常见文件头文件尾完整汇总

【CTF杂项】 常见文件头文件尾完整汇总

CTF杂项 常见文件头&文件尾完整汇总 一、基础概念 文件头(魔数 Magic Number):文件最开头固定十六进制字节,用来识别文件类型,CTF常用于隐写分离、伪加密、文件拼接、丢头修复。文件尾:文件末尾固定标识…

2026/10/13 9:34:13 阅读更多 →
MySQL的卸载安装与环境配置

MySQL的卸载安装与环境配置

一、判断本地电脑中是否有 MySQL 的环境在开始界面输入服务查看是否有 MySQL 的服务,查看状态是否为正在运行。服务列表中 MySQL 显示正在运行说明电脑中有 MySQL 的环境。二、卸载 MySQL1. 停止服务列表中 MySQL 的运行2. 找到原有的 MySQL 的安装目录,…

2026/10/3 9:46:50 阅读更多 →
NS-USBLoader终极指南:Switch文件传输与RCM注入的完整解决方案

NS-USBLoader终极指南:Switch文件传输与RCM注入的完整解决方案

NS-USBLoader终极指南:Switch文件传输与RCM注入的完整解决方案 【免费下载链接】ns-usbloader Awoo Installer and GoldLeaf uploader of the NSPs (and other files), RCM payload injector, application for split/merge files. 项目地址: https://gitcode.com/…

2026/10/4 20:20:53 阅读更多 →

最新新闻

PCL点云圆柱体分割实战:RANSAC原理、参数调优与工业应用

PCL点云圆柱体分割实战:RANSAC原理、参数调优与工业应用

做点云处理这几年,我有个特别深的体会:几乎每个项目里需要找的几何元素,翻来覆去就那么几种——平面、球、圆柱。平面最简单,一个法线加一个距离就描述完;球也不难,中心加半径一共四个参数;唯独…

2026/10/13 21:30:25 阅读更多 →
PHP+UniApp开发宠物饲养交流系统实战

PHP+UniApp开发宠物饲养交流系统实战

1. 项目概述最近完成了一个宠物饲养交流系统的开发项目,采用PHP后端UniApp前端的混合开发模式。这个系统包含APP和小程序双端应用,主要解决宠物主人在饲养过程中遇到的交流、知识分享和日常管理需求。从技术选型到功能实现,整个项目走下来积累…

2026/10/13 21:30:25 阅读更多 →
litellm实战:统一大模型API与网关部署全解析

litellm实战:统一大模型API与网关部署全解析

1. 多家大模型API来回切换的痛苦,才是litellm真正的用武之地 过去一年,我先后在几个项目里接入了不同的大模型服务商。说实话,最让人头疼的不是模型效果本身,而是API的调用方式五花八门。有的用 messages 数组传对话历史&#x…

2026/10/13 21:30:25 阅读更多 →
操作系统进程线程模型:状态切换、同步互斥与死锁详解

操作系统进程线程模型:状态切换、同步互斥与死锁详解

2. 状态模型与控制方法:从“三态图”到上下文切换2.1 三态与五态:多出来的“创建态”和“终止态”用来干嘛先解决一个最基础的问题:进程到底有哪几种状态?很多教材开头就给出三态模型——运行态、就绪态、阻塞态——配合那张经典的…

2026/10/13 21:30:25 阅读更多 →
LiteLLM:大模型API统一网关与智能路由中枢

LiteLLM:大模型API统一网关与智能路由中枢

1. 为什么是 LiteLLM:当大模型调用变成“API 路由器”这件事LiteLLM 这个名字第一次出现在我视野里,是在一个凌晨三点的告警群里。某高校实验室部署的推理服务突然响应延迟飙升,监控显示 OpenAI 接口超时率突破 40%,但本地 vLLM 实…

2026/10/13 21:30:25 阅读更多 →
imgsTools图片合并实战:基于Python和Pillow的拼接与批处理

imgsTools图片合并实战:基于Python和Pillow的拼接与批处理

简介:这是一份面向游戏开发者的图片合并工具 imgsTools 完整工程,基于 VALib 图像库与 MFC、GDI 技术实现,用于把多张图片合并为透明 PNG、GIF、JPEG,并生成 Cocos2d 可识别的 .plis 资源清单。PNG 适合精细界面元素与图标&#x…

2026/10/13 21:29:24 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →