news 2026/8/18 13:22:21

C# 学习8.7 泛型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C# 学习8.7 泛型

作业2

泛型

1.泛型的定义

publicclassMyClass{// 泛型方法:单独的方法也可以设置成泛型publicvoidMyClassMethod2<T>(Ta){Console.WriteLine(a);// 获取传入参数的实际类型Console.WriteLine(a.GetType().ToString());}// 方法也支持多个泛型类型参数publicvoidMyClassMethod3<T,U,K>(Ta,Ub,Kc){Console.WriteLine(a.GetType().ToString());Console.WriteLine(b.GetType().ToString());Console.WriteLine(c.GetType().ToString());}// 泛型类型参数别名可以使用中文(不推荐用于生产环境)publicvoidMyClassMethod4<,,动物>(人 a,车 b,动物 c){Console.WriteLine(a.GetType().ToString());Console.WriteLine(b.GetType().ToString());Console.WriteLine(c.GetType().ToString());}}

用类型参数代替具体类型,实现代码复用

2.泛型接口

// 定义一个泛型接口publicinterfaceIInterface<T>{Ttest1{get;set;}stringtest2{get;set;}TMethod();voidMethod1(Tabc);}// 泛型接口可以继承另一个泛型接口,并选择指定具体类型或保持泛型// 方式一:指定具体类型(如 string)publicinterfaceIIInterface<D>:IInterface<string>{DBoo{get;set;}voidSetBoo(Dvalue);}// 实现 IIInterface<int>publicclassMyClass2:IIInterface<int>{publicintBoo{get;set;}publicstringtest1{get;set;}publicstringtest2{get;set;}publicstringMethod(){returntest1;}publicvoidMethod1(stringabc){Console.WriteLine(abc);}publicvoidSetBoo(intvalue){Console.WriteLine(value);}}// 方式二:保持泛型,让实现类决定具体类型publicinterfaceIAnotherInterface<T,D>:IInterface<T>{DExtraData{get;set;}}// 实现 IAnotherInterface<string, int>publicclassMyClass3:IAnotherInterface<string,int>{publicstringtest1{get;set;}publicstringtest2{get;set;}publicintExtraData{get;set;}publicstringMethod(){returntest1;}publicvoidMethod1(stringabc){Console.WriteLine(abc);}}// 直接实现泛型接口,指定具体类型publicclassMyClass4:IInterface<int>{publicinttest1{get;set;}publicstringtest2{get;set;}publicintMethod(){returntest1;}publicvoidMethod1(intabc){Console.WriteLine(abc);}}

3.泛型的约束

// 基类publicclassBaseEntity{publicintId{get;set;}}// 接口publicinterfaceIAuditable{voidLogAction(stringaction);}// 同时继承基类和实现接口的类publicclassUser:BaseEntity,IAuditable{publicstringName{get;set;}publicvoidLogAction(stringaction){Console.WriteLine($"Audit --{Name}:{action}");}}// 泛型约束类// 约束顺序:基类(最多一个) -> 接口(零个或多个) -> new()(必须放在最后)publicclassRepository<T>whereT:BaseEntity,IAuditable,new(){privateList<T>_items=newList<T>();publicvoidAdd(){// 因为 new() 约束,可以安全地实例化 TTitem=newT();Console.WriteLine($"创建了一个{typeof(T).Name}对象");_items.Add(item);// 将新对象加入内部列表}publicvoidSave(Tentity){// 由于 BaseEntity 约束,可以直接访问 Id 属性Console.WriteLine($"保存了 entity 的类型:{entity.GetType().Name}, Id:{entity.Id}");entity.LogAction("Save 操作");_items.Add(entity);}publicList<T>GetAll(){return_items;}}
//U是T的约束条件,所以T一定是U的子类型// 类型参数之间的约束:T 必须能隐式转换为 UpublicclassWrapper<T,U>whereT:U{publicTItem;publicUSetUUU(Ta,Ub){returnb;}}

T : U 的含义:T 必须能够隐式转换为 U。
如果 U 是类,T 必须是 U 或其派生类。
如果 U 是接口,T 必须实现该接口。
如果 U 是另一个类型参数,则 T 必须满足该参数所代表的类型约束。

4.泛型的默认值

publicclassTestDefault<T>{// 使用 default 关键字获取各类型的默认值intdefaultInt=default;// 0booldefaultBool=default;// falsestringdefaultString=default;// nullpublicvoidTestValue(){Console.WriteLine($"int 的默认值是:{defaultInt}");// 0Console.WriteLine($"bool 的默认值是:{defaultBool}");// falseConsole.WriteLine($"string 的默认值是:{defaultString}");// null}// 返回泛型 T 的默认值// 对于值类型(如 int)返回 0,对于引用类型(如 string)返回 nullpublicTGetDefaultValue(){returndefault(T);}// 如果列表不为空,返回最后一个元素;否则返回默认值publicTGetLastItem(List<T>items){if(items==null||items.Count==0){returndefault(T);}else{returnitems[items.Count-1];}}}
知识点说明
泛型方法可以在非泛型类中定义,类型参数由调用时传入的参数推断
泛型接口继承继承时可指定具体类型,也可保持泛型让子类决定
泛型约束where T : 基类, 接口1, 接口2, new()顺序固定
default(T)值类型返回0/false,引用类型返回null,避免NullReferenceException
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/18 13:21:25

Koodo Reader 阅读设置调校指南:按场景搭出一间专属书房

Koodo Reader 阅读设置调校指南&#xff1a;按场景搭出一间专属书房 【免费下载链接】koodo-reader A modern ebook manager and reader with sync and backup capacities for Windows, macOS, Linux, Android, iOS and Web 项目地址: https://gitcode.com/GitHub_Trending/k…

作者头像 李华
网站建设 2026/8/18 13:18:33

界面控件DevExpress WinForm——轻松构建类Visual Studio UI(三)

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

作者头像 李华
网站建设 2026/8/18 13:16:16

迁移学习实战思路:如何用预训练模型完成文本分类

迁移学习实战思路&#xff1a;如何用预训练模型完成文本分类 从零训练语言模型往往需要大量语料、算力和时间。迁移学习的思路是复用预训练模型已经学到的通用语言表示&#xff0c;只用领域数据完成适配。这不是简单加载一个模型&#xff0c;而是一组围绕数据、训练范围和评估的…

作者头像 李华
网站建设 2026/8/18 13:11:35

67.QT-QSharedMemory

1.QSharedMemory介绍 QSharedMemory提供了多个线程和进程对共享内存段的访问。它还提供了一种方法&#xff0c;让单个线程或进程锁定内存以进行独占访问。当使用这个类时&#xff0c;请注意以下平台差异:Windows: QSharedMemory不“拥有”共享内存段。当有QSharedMemory实例附加…

作者头像 李华