C# 学习8.7 泛型

发布时间:2026/10/18 10:32:11
C# 学习8.7 泛型 作业2泛型1.泛型的定义publicclassMyClass{// 泛型方法单独的方法也可以设置成泛型publicvoidMyClassMethod2T(Ta){Console.WriteLine(a);// 获取传入参数的实际类型Console.WriteLine(a.GetType().ToString());}// 方法也支持多个泛型类型参数publicvoidMyClassMethod3T,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.泛型接口// 定义一个泛型接口publicinterfaceIInterfaceT{Ttest1{get;set;}stringtest2{get;set;}TMethod();voidMethod1(Tabc);}// 泛型接口可以继承另一个泛型接口并选择指定具体类型或保持泛型// 方式一指定具体类型如 stringpublicinterfaceIIInterfaceD:IInterfacestring{DBoo{get;set;}voidSetBoo(Dvalue);}// 实现 IIInterfaceintpublicclassMyClass2:IIInterfaceint{publicintBoo{get;set;}publicstringtest1{get;set;}publicstringtest2{get;set;}publicstringMethod(){returntest1;}publicvoidMethod1(stringabc){Console.WriteLine(abc);}publicvoidSetBoo(intvalue){Console.WriteLine(value);}}// 方式二保持泛型让实现类决定具体类型publicinterfaceIAnotherInterfaceT,D:IInterfaceT{DExtraData{get;set;}}// 实现 IAnotherInterfacestring, intpublicclassMyClass3:IAnotherInterfacestring,int{publicstringtest1{get;set;}publicstringtest2{get;set;}publicintExtraData{get;set;}publicstringMethod(){returntest1;}publicvoidMethod1(stringabc){Console.WriteLine(abc);}}// 直接实现泛型接口指定具体类型publicclassMyClass4:IInterfaceint{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()必须放在最后publicclassRepositoryTwhereT:BaseEntity,IAuditable,new(){privateListT_itemsnewListT();publicvoidAdd(){// 因为 new() 约束可以安全地实例化 TTitemnewT();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);}publicListTGetAll(){return_items;}}//U是T的约束条件所以T一定是U的子类型// 类型参数之间的约束T 必须能隐式转换为 UpublicclassWrapperT,UwhereT:U{publicTItem;publicUSetUUU(Ta,Ub){returnb;}}T : U 的含义T 必须能够隐式转换为 U。如果 U 是类T 必须是 U 或其派生类。如果 U 是接口T 必须实现该接口。如果 U 是另一个类型参数则 T 必须满足该参数所代表的类型约束。4.泛型的默认值publicclassTestDefaultT{// 使用 default 关键字获取各类型的默认值intdefaultIntdefault;// 0booldefaultBooldefault;// falsestringdefaultStringdefault;// nullpublicvoidTestValue(){Console.WriteLine($int 的默认值是:{defaultInt});// 0Console.WriteLine($bool 的默认值是:{defaultBool});// falseConsole.WriteLine($string 的默认值是:{defaultString});// null}// 返回泛型 T 的默认值// 对于值类型如 int返回 0对于引用类型如 string返回 nullpublicTGetDefaultValue(){returndefault(T);}// 如果列表不为空返回最后一个元素否则返回默认值publicTGetLastItem(ListTitems){if(itemsnull||items.Count0){returndefault(T);}else{returnitems[items.Count-1];}}}知识点说明泛型方法可以在非泛型类中定义类型参数由调用时传入的参数推断泛型接口继承继承时可指定具体类型也可保持泛型让子类决定泛型约束where T : 基类, 接口1, 接口2, new()顺序固定default(T)值类型返回0/false引用类型返回null避免NullReferenceException

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询