【Unity|C#】基础篇(10)——泛型(Generic)/ 泛型约束条件(where)
【学习资料】
《C#图解教程》(第17章):https://www.cnblogs.com/moonache/p/7687551.html
电子书下载:https://pan.baidu.com/s/1mhOmBG0
【内容】
- 定义
- 泛型类(class)
- 泛型函数
- 泛型委托
- 多个泛型定义(T1、T2、T3)
- 泛型的约束条件(where)
【笔记】
- 定义
- 与C++中的模板template<T>一样
- 可使用泛型的类型:类、结构、接口、委托、方法
- 注:泛型不只有一个T,可以定义多个泛型T1、T2、T3 ...
- 泛型类(class)
- 未知类型T,在创建对象时确定,这样可以避免重载多个MyList
// T的类型在创建对象时确定
public class MyList<T>
{
private int size = ;
public T[] values;
public MyList()
{
values = new T[size];
}
} void Start()
{
MyList<int> myList_int = new MyList<int>(); // T 为 int
MyList<string> myList_string = new MyList<string>(); // T 为 string
myList_int.values[] = ;
myList_string.values[] = "Alice";
}
- 泛型函数
- 减少函数重载,一个泛型T适配所有不同类型的参数
// 交换a和b
public void SwapValue<T>(ref T a, ref T b)
{
T temp = a;
a = b;
b = temp;
} void Start()
{
int i1 = , i2 = ;
string s1 = "Alice", s2 = "Bob"; SwapValue(ref i1, ref i2); // T 为 int
SwapValue(ref s1, ref s2); // T 为 string
Debug.Log(i1); // 输出:2
Debug.Log(s1); // 输出:Bob
}
- 泛型委托
- 与泛型类定义类似
// 泛型委托
delegate T NumberChanger<T>(T a, T b); public int AddNum(int a, int b)
{
return a + b;
}
public string AddString(string a, string b)
{
return a + b;
} void Start()
{
// T 为 int
NumberChanger<int> numberChanger_int = new NumberChanger<int>(AddNum);
// T 为 string
NumberChanger<string> numberChanger_string = new NumberChanger<string>(AddString);
}
- 多泛型T定义
- 泛型不一定只有一个T,也可以定义多个,T1、T2、T3 ...
// 多泛型T委托
delegate T3 NumberChanger<T1, T2, T3>(T1 a, T2 b); // int 与 float 相加,返回string
public string AddNumToString(int a, float b)
{
return (a + b).ToString();
} void Start()
{
// 创建泛型变量
NumberChanger<int, float, string> numberChanger = new NumberChanger<int, float, string>(AddNumToString);
}
- 泛型的约束条件(where)
- 对泛型T进行类型约束,在定义为泛型的代码后面加 where T: xxx ,表示T必须为xxx类型


- 举例:
public class Major // 职业
{ };
public class Teacher : Major // 教师
{ } public class Person<T1, T2, T3>
where T1 : class // T1 必须是个类 类型
where T2 : struct // T2 必须是个结构 类型
where T3 : Major // T3 必须是基类为Major的类
{
T1 value1;
T2 value2;
T3 value3;
} void Start()
{
// 报错:T1和T3不满足约束条件
//Person<int, int, int> person1 = new Person<int, int, int>(); // 正确:
// string 类型为 class System.String
// int 类型为 struct System.Int32
// Teacher 类型为 class Major
Person<string, int, Teacher> person2 = new Person<string, int, Teacher>();
}
【Unity|C#】基础篇(10)——泛型(Generic)/ 泛型约束条件(where)的更多相关文章
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...
- python 基础篇 10 函数进阶
本节主要内容:1. 函数参数--动态传参2. 名称空间, 局部名称空间, 全局名称空间, 作⽤域, 加载顺序.3. 函数的嵌套4. gloabal, nonlocal关键字 ⼀. 函数参数--动态传参 ...
- Java多线程系列 基础篇10 wait/notify/sleep/yield/join
1.Object类中的wait()/notify()/notifyAll() wait(): 让当前线程处于Waiting状态并释放掉持有的对象锁,直到其他线程调用此对象的线程notify()/not ...
- cocos2dx基础篇(10) 按钮控件CCControlButton
[3.x] (1)去掉 “CC” (2)对象类 CCObject 改为 Ref (3)按钮事件回调依旧为 cccontrol_selector ,没有使用 CC_CALLBACK_2 (4)按钮状态 ...
- Java - 泛型 ( Generic )
Java - 泛型 ( Generic ) > 泛型的特点 > 解决元素存储的安全性问题 > 解决获取数据元素时,需要类型强转的问题 ...
- Java多线程系列--“基础篇”11之 生产消费者问题
概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...
- 诱人的 react 视频教程-基础篇(14 个视频)
诱人的 react 视频教程-基础篇(14 个视频) 诱人的 react 视频教程 - 基础篇 #1 介绍「07:25」 诱人的 react 视频教程 - 基础篇 #2 create-react-ap ...
- [C# 基础知识梳理系列]专题六:泛型基础篇——为什么引入泛型
引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...
- C# 基础知识系列- 10 反射和泛型(二)
0. 前言 这篇文章延续<C# 基础知识系列- 5 反射和泛型>,继续介绍C#在反射所开发的功能和做的努力.上一篇文章大概介绍了一下泛型和反射的一些基本内容,主要是通过获取对象的类型,然后 ...
随机推荐
- ts中基本数据类型(上)
/* 定义数组*/ var arr: number[] = [1, 2, 3]; var arr1: Array<number> = [1, 2, 3]; var arr2: [str ...
- C语言关键词——register
register修饰符暗示编译程序相应的变量将被频繁使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度 例如:memcpy(des,src,i) { register char * d ...
- 内网学习之MySQL服务提权
利用MySQL提权原理: 1.具有mysql的root权限,且mysql以system权限运行. 2.具有执行sql语句的权限,webshell或者外连皆可 UDF提权 UDF(user define ...
- 解决Spring Security自定义filter重复执行问题
今天做项目的时候,发现每次拦截器日志都会打两遍,很纳闷,怀疑是Filter被执行了两遍.结果debug之后发现还真是!记录一下这个神奇的BUG! 问题描述 项目中使用的是Spring-security ...
- python—lambda函数,三个常用的高阶函数
"""lambda 参数列表 : 返回值lambda 参数形式: 1.无参数:lambda:100 2.一个参数:lambda a: a 3.默认参数:lambda a, ...
- .Net框架的模块代码生成器--其一(dotnet new)
小白教程声明,首先先介绍一下.Net 框架及模块是什么情况: 1.公司的大佬会把框架的代码打包成Nuget包放在公司的服务器上 2.公司会专门开一个git仓库,存储模块的代码,每个模块都有其独立的文件 ...
- P2813 母舰
------------------------------------------- 链接:P2813 ------------------------------------------- 一道贪 ...
- 【笔记】机器学习 - 李宏毅 - 6 - Logistic Regression
Logistic Regression 逻辑回归 逻辑回归与线性回归有很多相似的地方.后面会做对比,先将逻辑回归函数可视化一下. 与其所对应的损失函数如下,并将求max转换为min,并转换为求指数形式 ...
- Lucene索引维护(添加、修改、删除)
1. Field域属性分类 添加文档的时候,我们文档当中包含多个域,那么域的类型是我们自定义的,上个案例使用的TextField域,那么这个域他会自动分词,然后存储 我们要根据数 ...
- 拦截器——原理(AOP、责任链模式、配置)
1.Struts2拦截器概述: (1)Struts2框架封装中封装了很多功能,这些功能其实都是封装在Struts2的拦截器里面,Struts2里面有很多拦截器,每次不是这些拦截器都执行,每次只执行默认 ...