在Unity3D中使用泛型(上)
目录
为什么需要泛型机制
泛型机制的出现,最主要的目的就是代码复用。在泛型机制出现以前,面对不同的类型,即便使用的是同一套逻辑,仍然需要对类型进行强制转换。任何方法只要将object作为参数类型或者返回类型使用,那么就会有可能在某个时候触发强制类型转换。泛型的出现,使得逻辑复用变为了可能。
泛型的一个例子
下面,以List<T>这个常用的数据结构为例,说明泛型的特点。先上代码:
using System;
using System.Collections.Generic;
using UnityEngine;
public class Example:MonoBehaviour
{
private void Start()
{
//创建一个元素类型为string的List
List<string> animals=new List<string>();
//向animals添加string类型的对象
animals.Add("cats");
animals.Add("dogs");
//向animals添加int类型的对象,报错
animals.Add(1);
}
}
在定义泛型类型或泛型方法时,为类型指定任何变量都被称为类型参数,参数变量名为T,在上面的代码中,T是string。
泛型的好处
- 类型安全
- 更清晰的代码
- 更优秀的性能
Unity3D中常见的泛型
首先,使用泛型机制最明显的是一些集合类。例如在System.Collections.Generic和System.Collections.ObjectModel命名空间中提供了很多泛型集合类。
C#还提供了很多泛型接口。而插入集合中的元素则可以通过实现接口来执行例如排序、查找等操作。例如List<T> 就实现了IList<T>泛型接口,常用的泛型接口也往往定义在System.Collections.Generic中。
除此之外,System.Array类提供了很多静态泛型的方法,例如AsReadOnly、BinarySearch、ConvertAll、Exists、Find、FindAll等。
代码例子
using System;
using System.Collections.Generic;
using UnityEngine;
public class Example : MonoBehaviour
{
private void Start()
{
Byte[] bytes=new Byte[]{2,1,5,4,3};
//使用Array类的静态泛型方法sort对Byte排序
Array.Sort<Byte>(bytes);
//使用Array类的静态泛型方法BinarySearch查找Byte数组实例bytes中元素1的位置
int targetIndex=Array.BinarySearch<Byte>(bytes,1);
Debug.Log(targetIndex);
}
}
还有很多常用的泛型的例子,例如Dictionary<TKey,TValue>、KeyValuePair<T,T>等。具体用法可以参阅msdn文档中System.Collections.Generic 命名空间中的描述。
小结
本次我们归纳了泛型产生的原因、泛型的优点,并举例进行说明。下次将归纳泛型机制的原理、泛型继承、以及泛型委托等内容。