Unity开发之C#基础-泛型

前言

本章 我们将要讲解c#当中的泛型类 泛型类的使用非常常见 请大家仔细阅读喔!

制作不易还请各位一键三连哦!

什么是泛型

从简单意义上讲 所谓泛型,就是通过参数化类型来实现在同一份代码上操作多种数据类型

泛型的设计思想

C#语言从2.0版本开始引入泛型,其核心思想就是将算法从数据结构中抽象出来,使得预定义的操作能够作用于不同的类型,从而提高了程序的效率、通用性和类型安全性,进而简化整个编程模型。

定义泛型类

在创建一个泛型类时,需要使用一个类型参数来定义类。其语法格式如下所示:

[访问修饰符] class 类型名<T>{

	....

}

其中,T代表类型参数,它作为占位符来使用,会在编译时被一个真正的类型所取代。

泛型类的使用

在泛型的定义中,类型参数可以作为字段,方法的参数和返回值,以及方法代码中局部变量的类型。而在创建泛型类的构造类型的对象时,这些类型参数都被替换为对应的具体类型。

示例

创建一个新的项目,泛型类,并创建一个新的Test类 作为一个泛型类
在这里插入图片描述
然后我们在Main函数中 调用

在这里插入图片描述

这就是泛型类的使用

多个类型参数的泛型

泛型类可以有多个类型参数,其中每个参数指代一个抽象数据类型。定义时这些类的参数之间通过逗号分隔。

示例

新建一个泛型类Test2 两个类型参数 分别使用L,R代替 并定义一个Print方法 参数列表为L,R 函数内容为将两个参数转为字符串拼接输出

在这里插入图片描述

Main函数中调用

在这里插入图片描述

类型参数与标识

泛型类的标识由名称和类型参数共同组成,因此类型参数区分不同的类型

例如:
如果在程序中定义普通类Pair、一元泛型类Pair和二元泛型类Pair<L,R>,它们分别表示不同的类型,不会引起编译错误。

也就是说 类型参数的名称仅仅是一个指代作用,而不能区分不同的类型
例如:
不能在一个程序中同时定义泛型类Pair和Pair,也不能同时定义Pair<L,R>和Pair<R,L>。

不过 泛型类的类型参数 也能区分不同的方法成员
例如:
新建一个泛型类Pair<L,R> 定义L类型变量Left,定义R类型变量Right 并重写书写有参构造 定义两个函数 分别赋值Left,Right

在这里插入图片描述
我们来调用一下

在这里插入图片描述

需要注意的是 如果像Pair<int, int> 这样的构造类型就会导致两个SetValue方法的标识相同,
就不会通过编译,因为编译器不能确定应该调用哪一个方法。

Pair<int, int> p2 = new Pair<int, int>(100, 300);
p2.SetValue(100); //错误:存在歧义

也就是说 在两个方法出现重名时,如果其中一个方法的原型使用了参数类型,另一个方法的原型没有使用类型参数,此时不会引起歧义,而程序总是调用没有类型参数的方法。

public class Test<T>
{
	public void SetValue(int i)
	{
		//没有使用参数原型
	}
	public void SetValue(T t)
	{
	}
}

泛型的优点

通过使用泛型,我们可以极大地提高代码的重用度,避免了隐式的装箱、拆箱,在一定程度上提升了应用程序的性能。通过创建泛型类,可以创建一个在编译时类型安全的集合。那么 什么是拆箱装箱呢?

拆箱和装箱

ArrayList list=new ArrayList();
list.Add(20); //装箱,list存放的是object类型元素,须将值类型转化为引用类型。
int i=(int)list[0]; //拆箱,list[0]的类型是object,要赋值就得把引用类型转化为值类型。

也就是说 将类型进行隐式或者显式等这种默认的转换类型 就是拆箱和装箱 因为需要进行多一步的运算
如果换成泛型编程,就不会有装箱和拆箱的性能损失

List<int> list=new List<int>();
list.Add(20); //因为指定了用int来实例化,因此不必装箱。
int i=list[0]; //同样地,访问时也不需要拆箱 。

类型安全

ArrayList list = new ArrayList();
list.Add(3);
list.Add("It is raining in Redmond.");
foreach(int i in list)
{
Debug.Log (i); //异常,因为并不是集合中的所有元素都可以转化为int。
}

如果改用泛型编程,则可以避免这种异常,让编译器检查出错误

List<int> list=new List<int>();
list.Add(20);
list.Add(string); //编译时报错,只能将整数类型添加到集合中。

泛型约束

在默认情况下,泛型中的类型参数可以被替换为任意类型,这在很多情况下并不是人们所希望的。C#支持在泛型定义中通过where关键字来对类型参数进行限制。

主要限制

主要限制是指类型参数只能被替换为值类型或引用类型。

public class Pair<L, R> where L : struct
{
//.... 
}

在泛型类的定义中,类型限制是在where关键字后依次写上类型参数、冒号以及限制方法,
其中struct关键字表示值类型,而class关键字表示引用类型。

public class Pair<L, R> where R : class
{
//.... 
}

如果要为多个类型参数同时添加限制,那么就应使用多个where限制语句,之间通过空格
或换行符进行分隔。

public class Pair<L, R> where L : struct where R :class
{
//.... 
}

总结

以上就是对泛型的一些基本介绍和使用方法 泛型会经常出现在我们的代码里大家好多多练习读透泛型的概念。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想吃烤地瓜.

高抬小手一点

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值