《C#进阶》--01.泛型


提示:以下是本篇文章正文内容,下面案例可供参考

一、基本介绍

需要说明,泛型语法是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)
{
   
   

}
----------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值