尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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 泛型类型安全、不用装箱、不用强转
RELATED

相关推荐

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

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

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

📅 2026/9/23 2:32:12
如何快速掌握SolidWorks 3D建模:面向初学者的终极指南

如何快速掌握SolidWorks 3D建模:面向初学者的终极指南

如何快速掌握SolidWorks 3D建模:面向初学者的终极指南 【免费下载链接】SolidWorks-crack solidworks-crack-download solidworks-free-download-full-version-with-crack solidworks-crack-2024 solidworks-keygen solidworks-serial-key solidworks-full-crack s…

📅 2026/9/14 22:51:49
Intel RealSense MATLAB开发者包实战指南:深度相机数据处理与三维重建进阶

Intel RealSense MATLAB开发者包实战指南:深度相机数据处理与三维重建进阶

Intel RealSense MATLAB开发者包实战指南:深度相机数据处理与三维重建进阶 【免费下载链接】librealsense RealSense SDK 项目地址: https://gitcode.com/GitHub_Trending/li/librealsense Intel RealSense SDK为MATLAB开发者提供了强大的深度相机集成能力&a…

📅 2026/9/9 13:42:55
MORE NEWS

更多资讯

📰

伪代码中无用函数返回值:接口语义的减法与代码整洁

从代码整洁到团队协作:我为什么坚持删掉伪代码里那些没用的返回值 先说结论:工作这些年,我越来越觉得伪代码里的“函数返回值”不是随便写的。它就像程序设计时的“契约”,哪怕只是画草图,契约里没用的条款也会让人误…

📰

基于Golang的网络安全靶场:Gin+Gorm+Docker实战指南

简介:这份文档面向网络安全方向的学生、安全运维人员及攻防技术爱好者,围绕基于Golang的网络安全靶场系统展开完整设计与实现论述,帮助读者理解如何用Go语言搭建可模拟、复现网络攻击的实验环境,从而在实战中掌握攻击手法并推导对…

📰

Flutter鸿蒙适配实战:消息反馈系统的跨端实现与踩坑

先把结论放在前面:一个 Flutter 项目要上一个新平台,最麻烦的从来不是把页面跑起来,而是那些要跟系统原生能力打交道的模块。消息反馈就是这样一类典型模块——表面上不过是一个“表单加列表”,真正落地的时候,通知、角…

📰

Flutter鸿蒙版消息反馈系统开发实践:架构设计与踩坑记录

做鸿蒙版App的时候,团队在技术选型上纠结了挺久。最后定下来用Flutter构建“享家社区”的HarmonyOS APP,而且第一个完整跑通的模块,就是消息反馈系统。这个模块看着不起眼,却是社区类产品里最容易暴露问题的一环:用户要…

📰

Gradio生产级ML应用实战:从Demo到K8s部署的完整工程化指南

几个月前我给公司的推荐模型搭了个临时演示页面,用 Gradio 写了个两百行的脚本,拖个滑块、传张图就能看推理结果。当时产品经理说“这玩意能直接上线就好了”,我嘴上应付着“快了快了”,心里清楚这套代码连最基本的身份校验都没有…

📰

Anaconda虚拟环境底层原理与PyCharm配置真相

1. 为什么你每次在PyCharm里跑代码都报“ModuleNotFoundError”,而同事的项目却稳如泰山? 我见过太多人把Python开发环境搞成“玄学现场”:明明pip install了requests,运行时却提示找不到;换台电脑重装一遍&#xff0c…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬