[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[数学]}); } }

相关新闻

前端进阶-设计模式

前端进阶-设计模式

1、创建型模式 创建型模式介绍的是:创建对象的机制, 能够提升已有代码的灵活性和可复用性。 简单工厂模式&工厂方法模式(常用) 负责创建所有的实例,依照不同的类型创建不同的对象 优点: 屏蔽了对象…

2026/7/30 10:47:46阅读更多 →
口碑好的车用油复合剂服务商

口碑好的车用油复合剂服务商

对于润滑油调合厂、车用油品牌商的采购团队而言,筛选车用油复合剂服务商的核心诉求从来不是“价格最低”,而是配方达标、批次稳定、交付及时、能配合定制调整——毕竟一旦供应商掉链子,轻则整批成品油不合格返工,重则丢失长期客户…

2026/7/30 10:47:46阅读更多 →
VLAN划分方式全解析:从端口到策略的网络隔离实战指南

VLAN划分方式全解析:从端口到策略的网络隔离实战指南

1. VLAN划分方式概览:从基础到进阶的网络隔离艺术 在任何一个规模稍大的企业或园区网络中,广播风暴都是一个让人头疼的问题。想象一下,成百上千台设备在同一个广播域里“喊话”,不仅网络效率低下,安全也毫无保障。这时…

2026/7/30 10:45:46阅读更多 →
5分钟快速上手Pure Admin Thin:超轻量Vue3后台管理系统框架

5分钟快速上手Pure Admin Thin:超轻量Vue3后台管理系统框架

5分钟快速上手Pure Admin Thin:超轻量Vue3后台管理系统框架 【免费下载链接】pure-admin-thin vue-pure-admin官方精简版 项目地址: https://gitcode.com/gh_mirrors/pu/pure-admin-thin Pure Admin Thin是基于Vue 3和Element Plus构建的超轻量级后台管理系统…

2026/7/30 11:52:02阅读更多 →
专业级微信公众号数据采集工具:wechat_articles_spider深度解析与实战指南

专业级微信公众号数据采集工具:wechat_articles_spider深度解析与实战指南

专业级微信公众号数据采集工具:wechat_articles_spider深度解析与实战指南 【免费下载链接】wechat_articles_spider 微信公众号文章的爬虫 项目地址: https://gitcode.com/gh_mirrors/we/wechat_articles_spider 在当今内容驱动的数字时代,微信公…

2026/7/30 11:52:02阅读更多 →
学术论文审稿回复:从沟通策略到实战技巧的完整指南

学术论文审稿回复:从沟通策略到实战技巧的完整指南

1. 项目概述:从“套话”到“有效沟通”的学术生存术 “回复审稿人的套话”,这个标题乍一看,似乎是在寻找一种可以应付差事的、标准化的“话术模板”。但作为一名经历过数十次投稿、审稿和修改轮回的科研从业者,我深知这背后远非“…

2026/7/30 11:52:02阅读更多 →
中兴光猫配置解密终极指南:5分钟掌握配置文件加解密技巧

中兴光猫配置解密终极指南:5分钟掌握配置文件加解密技巧

中兴光猫配置解密终极指南:5分钟掌握配置文件加解密技巧 【免费下载链接】ZET-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/ze/ZET-Optical-Network-Terminal-Decoder 中兴光猫配置解密是许多网络管理员和家庭用户面临的常…

2026/7/30 11:52:02阅读更多 →
FPGA波形发生器设计:Verilog实现与Quartus仿真全流程解析

FPGA波形发生器设计:Verilog实现与Quartus仿真全流程解析

1. 项目概述与核心价值最近在整理一些FPGA的练手项目,发现一个非常经典且能串联起多个核心知识点的选题:用Verilog在FPGA上实现一个波形信号发生器,并用Quartus完成仿真验证。这听起来像是数字电路课的实验,但真正动手做下来&…

2026/7/30 11:52:02阅读更多 →
2026年施工管理软件测评:5款主流工具对比,哪款更适合你?

2026年施工管理软件测评:5款主流工具对比,哪款更适合你?

工程项目越来越复杂,利润却越压越薄。靠微信群、Excel和纸质单据管项目的日子,正在让一批施工企业付出真金白银的代价。于是,“上一套施工管理软件”成了老板们达成共识的事。可打开搜索,广联达、用友、新中大……名字都听过&…

2026/7/30 11:50:02阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/29 7:00:19阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →