C# 泛型(Generic)通用的,标准的
- 定义:泛型允许我们延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。(也就是说泛型是可以与任何数据类型一起工作的类或方法)模块内高内聚,模块间低耦合。
- 泛型的使用:当我们的类/方法不需要关注调用者传递的实体是什么(公共基类工具类),这个时候就可以使用泛型。
一.泛型的特性
- 它有助于实现代码的重用,保护类型的安全以及提高性能。
- 我们可以自定义:泛型接口、泛型类、泛型方法、泛型事件和泛型委托。(提高程序的整个扩展性和紧实性)
- 我们还可以对泛型类进行约束以访问特定的数据类型的方法。
- 关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。
- C#泛型类在编译时,先生成中间代码IL,通用类型T只是一个占位符。在实例化类时,根据用户指定的数据类型代替T并由即时编译器(JIT)生成本地代码,这个本地代码中已经使用了实际的数据类型,等同于用实际类型写的类
- 性能高(防止了非泛型的频繁拆装箱),类型安全,二进制代码重用,代码的扩展。
二.泛型的限定条件
- 结构(l类型参数必须是值类型,可以指定除Nulllable以外的任何值类型)。
- 类(类型参数必须是引用类型,包括任何类,接口,委托或数组类型)
- new()(类型必须具有无参数的公共构造函数)
- <接口名称> 类型参数必须是指定的接口或实现指定的接口
/// <summary>
/// 利用泛型创建一个动态数组
/// </summary>
class DyArray<T>
{
private T[] arr;//声明泛型动态数组
public int arrLength;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="len"></param>
public DyArray(int len)
{
this.arrLength = len;
arr = new T[len];//初始化动态数组
}
/// <summary>
/// 向指定位置添加数据
/// </summary>
/// <param name="index"></param>
/// <param name="t"></param>
public void AddObj(int index, T t)//如果是string类型的动态数组。T就是string类型的数据
{
if (index < arr.Length && index >= 0)
{
arr[index] = t;
}
else
{
Console.WriteLine("索引不合理!");
}
}
/// <summary>
/// 移除某个位置的数据
/// </summary>
/// <param name="index"></param>
public void RemoveObj(int index)
{
if (index < arr.Length && index >= 0)
{
arr[index] = default(T);//为该索引位置的值设置为类型默认值 因为是固定长度的数组,所以移除也只是把该处的值设置成其类型的默认值(len:20 只有12 其余的也是自动默认补位为0‘默认’);
}
else
{
Console.WriteLine("索引不合理!");
}
}
/// <summary>
/// 遍历动态数组
/// </summary>
public void FindArray()
{
for (int i = 0; i < arr.Length; i++)
{
Console.WriteLine(arr[i]);
}
}
//-----------------------------------------------
//泛型:用到才会去指定数据类型,无需关注实体类型
DyArray<int> dy = new DyArray<int>(3);//创建实例,创建一个长度为10的Int数组
dy.AddObj(0, 1);//添加
dy.AddObj(1, 2);//添加
dy.AddObj(2, 3);//添加
dy.RemoveObj(1);//移除索引为1
dy.FindArray(); //1 0 3
Console.ReadKey();
C#泛型委托
- 自带:Action Func
//利用泛型创建没有返回值的带参数的委托
Action<string> method2=Show;//Action<T>
method2(“张三”);
//利用泛型创建一个string类型参数,返回值是Int类型的委托
Func<string,int> methods=ShowAge;
Console.WriteLine("您要查询的用户年龄是:"+ShowAge("张三"));