恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

[C#]泛型类与泛型方法

  • 首页
  • 资讯中心
  • /
  • [C#]泛型类与泛型方法

相关资讯

前端进阶-设计模式 2026/8/2 9:06:41
口碑好的车用油复合剂服务商 2026/8/2 17:32:50
单片机毕业设计-基于 STM32 的防干烧饮水设备监测控制系统开发 基于单片机的水温水位采集与声光报警系统设计(012101) 2026/8/2 17:32:51

最新资讯

三维地质建模与抗滑桩设计在边坡工程中的应用
从NandFlash板卡到存储系统:硬件设计、驱动开发与文件系统移植实战
基于SIM800C与NEO-7M的物联网终端开发:从硬件设计到低功耗追踪实战
【高并发AI图处系统崩盘实录】:单日300万请求下稳定性保障的9个反模式与重建路径
React组件的构造函数是否必须存在:全面解析类组件初始化与最佳实践
把定时 Agent 做成可恢复任务系统:状态机、队列与模型调用边界

今日推荐

无线一体式手持三维扫描仪推荐:摆脱电脑束缚的工业检测新选择
3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

本周热门

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案
分布式配置中心选型实战:Nacos与Consul在创业场景下的对比
MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

[C#]泛型类与泛型方法

发布时间:2026/8/2 17:32:49
[C#]泛型类与泛型方法 一、C与C#泛型写法区别//C 写法你已经会的 templatetempname T class Stack { PUblic: void Push(T x) { Data.push_back(x); } T top() { T x data.back(); data.pop_back(); return x; } private: vectorTData; } // 泛型函数 templatetempname T void Print(T item) { coutitem endl; } Stackint si; // 实例化 Stackstring ss;//c#写法 class StackT { private ListT _data new(); // new() 目标类型 new省类型名 public void Push(T x) _data.Add(x); public T Pop() { var item _data[^1]; // [^1] 最后一个C# 索引运算符 _data.RemoveAt(_data.Count - 1); return item; } public int Count _data.Count; } // 泛型方法 —— T 写在方法名后 void PrintT(T item) Console.WriteLine(item); Stackint si new(); // 实例化类型靠右边推断 Stackstring ss new();1.1对照图CC#备注templatetypename Tclass StackTC# 把 T 直接写在类名后没有 template 前缀StackintStackint实例化语法完全一样templatetypename T void Print(T)void PrintT(T item)C# 的 T 写在方法名和参数列表之间编译期源码展开运行时具化⚠️ 见第 3 步这是灵魂差异 一个小甜点C# 的 new() 叫目标类型 newStackint si new(); 里右边不用再写 Stackint()编译器看左边猜右边。C17 的 Stackint si{}; 类似。二、泛型集合C# 日常 90% 的泛型用在这两个集合上记住这个映射就行CC#说明std::vectorTListT动态数组最常用std::unordered_mapK,VDictionaryK,V哈希表std::mapK,VSortedDictionaryK,V有序红黑树v.push_back(x)list.Add(x)v.size()list.Count注意是属性不是方法v[i]list[i]索引访问一样v.back()list[^1]C# 用 ^ 从后往前数Listint new() {1,2,3}; //初始器 nums.Add(4); Console.WriteLine(nums[^1]); // 4最后一个 Dictionarystring, int ages new() { [张三] 20; [李四] 30; }; Console.WriteLine(ages[张三]); // 20三、核心差异——为什么 C# 泛型不能用 这是今天最该花时间的地方。看这段对比4.1 C 模板编译期源码展开duck typingtemplatetypename T T Add(T a, T b) { return a b; } // 只要 T 有 operator就能编过 Add(3, 5); // OKint 有 Add(string(a), string(b)); // OKstring 有 Add(Thing{}, Thing{}); // 只要 Thing 重载了 就 OKC 编译器看到 Addint就把模板里每个 T 替换成 int生成一份专门的 Add 代码。它不检查「T 有没有 」它只是把代码抄一遍等替换完再看 int int 合不合法。模板的本质是高级的文本替换/代码生成。4.2 C# 泛型运行时具化reified编译期只认一份 ILT AddT(T a, T b) a b; // ❌ 编译错误运算符 不能应用于类型 T为什么错因为 C# 编译器在编译 AddT 时它真的不知道 T 是什么。它只编译出一份泛型 IL 代码这份代码要在运行时、当你传 int 进去时才「具化」成 Addint。编译期它没有任何理由相信 T 一定有 ——万一你传个 Person 进来呢Person Person 不存在啊。所以编译器直接拒绝。这就是为什么 C# 泛型叫 reified具化泛型类型 Listint 在运行时是一个真实存在的、具体的类型而不是编译后就被擦除掉Java 那种叫类型擦除 erasure。但代价是——编译期对 T 能做什么一无所知除非你用约束告诉它。4.3 这个差异会带来什么后果场景C 模板C# 泛型a b✅ 只要 T 有 就行❌ 直接报错new T()✅ 默认就行❌ 要加 where T : new() 约束T t null✅ 指针类型可以❌ 要加 where T : class 约束调 t.CompareTo(x)✅ 有这个方法就行❌ 要加 where T : IComparableT四、总结一句话总结C 模板是「先抄代码再检查」C# 泛型是「先检查约束再用」。C# 想用 T 的任何能力都必须用 where 约束提前声明。你只要记住「C# 泛型对 T 一无所知」这个直觉就够了。using System; using System.Collections.Generic; // ---------- 1. 泛型类 StackT ---------- class StackT { private readonly ListT _items new(); public void Push(T item) _items.Add(item); public T Pop() { if (_items.Count 0) throw new InvalidOperationException(栈是空的); var top _items[^1]; _items.RemoveAt(_items.Count - 1); return top; } public T Peek() { if (_items.Count 0) throw new InvalidOperationException(栈是空的); return _items[^1]; } public int Count _items.Count; public bool IsEmpty Count 0; } // ---------- 2. 泛型方法 ---------- class Printer { // T 写在方法名后、参数表前。调用时通常可省略靠参数推断 public static void PrintT(T item) Console.WriteLine($值 {item}类型 {typeof(T).Name}); } // ---------- 3. 主程序 ---------- class Program { static void Main() { Console.WriteLine( 栈int 类型 ); Stackint intStack new(); intStack.Push(10); intStack.Push(20); intStack.Push(30); Console.WriteLine($栈顶(不弹出): {intStack.Peek()}); Console.WriteLine($弹出: {intStack.Pop()}); Console.WriteLine($弹出: {intStack.Pop()}); Console.WriteLine($剩余数量: {intStack.Count}); Console.WriteLine(\n 栈string 类型同一个类不同 T); Stackstring strStack new(); strStack.Push(你好); strStack.Push(世界); Console.WriteLine($弹出: {strStack.Pop()}); Console.WriteLine($弹出: {strStack.Pop()}); // intStack.Push(字符串); // ❌ 编译错误类型安全int 栈不能塞 string // 这就是泛型相比 C 模板的最大日常价值编译期类型检查 无装箱 Console.WriteLine(\n 泛型方法 ); Printer.Print(42); // 推断 T int Printer.Print(泛型方法); // 推断 T string Printer.Print(3.14); // 推断 T double Console.WriteLine(\n ListT / DictionaryK,V 快速体验 ); Liststring names new() { 张三, 李四, 王五 }; names.Add(赵六); foreach (var n in names) Console.WriteLine($ - {n}); Dictionarystring, int score new() { [数学] 90, [语文] 85 }; score[英语] 95; Console.WriteLine($数学成绩: {score[数学]}); } }

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号