C# 泛型
一、定义
使用泛型是一种增强程序功能的技术,具体表现在以下几个方面:
- 它有助于最大限度地重用代码、保护类型的安全以及提高性能。
- 可以创建泛型集合类。.NET 框架类库在 System.Collections.Generic 命名空间中包含了一些新的泛型集合类。您可以使用这些泛型集合类来替代 System.Collections 中的集合类。
- 可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
- 可以对泛型类进行约束以访问特定数据类型的方法。
- 关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取
二、泛型种类
/// <summary>
/// 泛型方法
/// </summary>
public class GenericsMethord
{
//这里介绍泛型方法,在之前02-泛型的引入中,使用的就是泛型方法,这里再重复一次
/*
详解:T为泛型的一个代表,换成别的字母同样可以
T和A代表的类型在使用时才声明,俗称“延迟声明”
*/
public static void ShowModel<T, A>(T model1, A model2)
where T : ModelFather
where A : model3
{
Console.WriteLine("id值为:" + model1.id + " name值为:" + model1.name);
Console.WriteLine("id值为:" + model2.id + " name值为:" + model2.name);
}
}
/// <summary>
/// 泛型类
/// </summary>
public class GenericsClass<T>
{
public string id { get; set; }
public string name { get; set; }
public void Test(T t)
{
Console.WriteLine(t.GetType());
}
}
/// <summary>
/// 泛型接口
/// </summary>
public class GenericsInterface
{
public interface IGet<T>
{ }
}
/// <summary>
/// 泛型委托
/// </summary>
public class GenericsDelegate
{
public delegate void GetHandler<T>();
}
三、泛型约束
1. 基类约束:where T:<基类名>
2. 接口约束:where T:<接口名称> 约束的接口也可以是泛型的
3. 无参构造函数约束:where T: new() 提供的任何类型参数都必须具有可访问的无参数(或默认)构造函数。当与其他约束一起使用时,new() 约束必须最后指定。
4. 值类型约束:where T:struct 类型参数必须是值类型,可以指定除 Nullable 以外的任何值类型。
5. 引用类型约束: where T:class 类型参数必须是引用类型,也适用于任何类、接口、委托或数组类型。当与其他约束一起使用时,class 约束必须最先指定。
public static void ShowModel<T, A>(T model1, A model2)
where T : ModelFather
where A : model3
public void ShowManyCon<T>(T t) where T : class, IWork, ISport, new()
四、原理和好处
1.减少代码冗余量,精简代码
2.避免了拆箱和装箱过程(类型转换)中代理的性能损失(使用Object类型)
3.结合IDE的只能提示,提高了开发效率
五、default(T)
1. 在泛型中如果需要返回泛型类型的默认值则会用到这个关键字。
2. T是值类型而非结构的则default(T) 数值类型返回0,字符串返回空。
3. 是非引用类型是结构时候返回初始化为零或空的每个结构成员。
4. 引用类型返回NULL
5. 其实就是为了返回默认值,比如int i =0;这样是可以的,但是int i=null是不可以的,但是泛型的时候不知道是值类型还是引用类型所以不知道如何赋默认值。
用这个关键字就解决了这个问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧