FEATURED · 精选文章

C# 学习8.7 泛型

发布时间 / 2026/8/18 13:22:35
来源 / 创域科博编辑部
栏目 / 资讯中心
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
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻