提示:以下是本篇文章正文内容,下面案例可供参考
一、基本介绍
需要说明,泛型语法是C#进阶语法学习中的最基础的语法,很多语法和技术点的学习,知识点的耦合非常严重,例如委托,Lambda等等的学习中,都穿插着泛型的使用,这也是C#进阶语法学习的起点
泛型背景
1)ArrayList
先看一个常用集合ArrayList的基本使用
ArrayList arr = new ArrayList();
arr.Add(0);
arr.Add("");
arr.Add(new Man());
ArrayList再存数据时指定是Object,存储起来非常方便,可以存放任意类型的元素,但是它有以下几个缺点
- 存值容易,取值复杂,取出的值都是Object,真正处理的时候,还需要进行转换
- 类型安全问题
- 方法性能不好,存入的元素都要进行装箱处理(如int类型存放到栈中,Object是对象,存放在堆中,需要继续拷贝一份到堆中,也就是值类型转换成引用类型)
2)List
List使用泛型解决了上述问题
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
什么是泛型
1)概念
可以在方法,类上添加一个未知的,动态的类型参数,由调用者来确定传入的类型,而非定义时就确定必须是什么类型。类型参数跟在方法名或类,接口名后面,用"<>"把类型参数包裹起来。
2)延迟声明
泛型在声明时不确定具体类型,用一个占位符T/S(或任何字母标识即可)表示,在要调用的时候,调用者需要明确具体的类型,也就是类型的延迟声明
3)基本特点
- 高性能:通过泛型缓存的机制,在第一次调用明确类型时,当前类型即被缓存,实现与明确类型一样的性能
- 通用性:一个延迟声明的类型可以解决多种类型参数的问题
4)基本使用
public static void test01<T>(T t)
{
Console.WriteLine(typeof(T).Name);
}
-------------------------------------------------------------------------
public static void Main(string[] args)
{
//1.完整写法
test01<int>(1);
//2.简写
//如果参数类型和<T>中有对应关系,声明明确的参数,可以省略<string>
test01("121");
}
泛型的实现
- 泛型是.NetFramework2.0后面更新出显得,包含编译器和CLR升级
- 编译器升级,支持泛型,遇到泛型生成多个占位符,占位符数量与类型参数数量一致
- CLR升级后,JIT支持泛型,在编译过程达到JIT进行编译时,类型参数也确定了,所以JIT能够根据据类型进行编写一个确定类型,比如泛型方法这时候会变成确定参数类型的方法,JIT编译泛型方法时与我们原生写具体参数类型方法编译一致(等同与原生代码)。

二、泛型方法
1)定义
在方法上使用类型参数的就是泛型方法。
2)基本使用
- 类型参数可以声明多个,声明的也可以不使用,也可以添加固定类型
- 调用时,传入的参数与泛型参数对应时,可以省略不写
- 当泛型方法有返回值时,可以进行一个默认值的返回
public static void test01<A>(A a)
{
return default(A);
}
public static void test01<T,S,a,XZP>(int aa,int bb,T t,S s)
{
}
----------------

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



