【学习资料】

  《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)的更多相关文章

  1. Java多线程系列--“基础篇”10之 线程优先级和守护线程

    概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...

  2. python 基础篇 10 函数进阶

    本节主要内容:1. 函数参数--动态传参2. 名称空间, 局部名称空间, 全局名称空间, 作⽤域, 加载顺序.3. 函数的嵌套4. gloabal, nonlocal关键字 ⼀. 函数参数--动态传参 ...

  3. Java多线程系列 基础篇10 wait/notify/sleep/yield/join

    1.Object类中的wait()/notify()/notifyAll() wait(): 让当前线程处于Waiting状态并释放掉持有的对象锁,直到其他线程调用此对象的线程notify()/not ...

  4. cocos2dx基础篇(10) 按钮控件CCControlButton

    [3.x] (1)去掉 “CC” (2)对象类 CCObject 改为 Ref (3)按钮事件回调依旧为 cccontrol_selector ,没有使用 CC_CALLBACK_2 (4)按钮状态  ...

  5. Java - 泛型 ( Generic )

    Java - 泛型 ( Generic )     > 泛型的特点         > 解决元素存储的安全性问题         > 解决获取数据元素时,需要类型强转的问题     ...

  6. Java多线程系列--“基础篇”11之 生产消费者问题

    概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...

  7. 诱人的 react 视频教程-基础篇(14 个视频)

    诱人的 react 视频教程-基础篇(14 个视频) 诱人的 react 视频教程 - 基础篇 #1 介绍「07:25」 诱人的 react 视频教程 - 基础篇 #2 create-react-ap ...

  8. [C# 基础知识梳理系列]专题六:泛型基础篇——为什么引入泛型

    引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...

  9. C# 基础知识系列- 10 反射和泛型(二)

    0. 前言 这篇文章延续<C# 基础知识系列- 5 反射和泛型>,继续介绍C#在反射所开发的功能和做的努力.上一篇文章大概介绍了一下泛型和反射的一些基本内容,主要是通过获取对象的类型,然后 ...

随机推荐

  1. 分布式服务追踪:Spring Cloud Sleuth

    最近在学习Spring Cloud的知识,现将分布式服务追踪:Spring Cloud Sleuth 的相关知识笔记整理如下.[采用 oneNote格式排版]

  2. Python3标准库:heapq堆排序算法

    1. heapq堆排序算法 堆(heap)是一个树形数据结构,其中子节点与父节点有一种有序关系.二叉堆(binary heap)可以使用一个有组织的列表或数组表示,其中元素N的子元素位于2*N+1和2 ...

  3. css基础-float浮动

    float实现文字环绕图片效果: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  4. HTML表单概念、语法及创建表单,案例

    form 标签 Input标签的type属性值 单行文本域 <input type="text" /> 图像域(图像提交按钮) 下拉菜单和列表标签 select 标签属 ...

  5. 【终端命令】SSH服务,远程登录

    一.SSH协议 在Linux中SSH是非常常用的工具,通过SSH客户端我们可以连接到运行了SSH服务器的远程机器上. SSH客户端是一种 使用"Secure Shell (SSH)" ...

  6. JSP数据交互2

    application对象 application对象负责提供应用程序在服务器中运行时的一些全局信息,常用的方法有getMimeType和getRealPath等. 运用实例:网页访问计数器. < ...

  7. TCP 协议快被淘汰了,UDP 协议才是新世代的未来?

    TCP 协议可以说是今天互联网的基石,作为可靠的传输协议,在今天几乎所有的数据都会通过 TCP 协议传输,然而 TCP 在设计之初没有考虑到现今复杂的网络环境,当你在地铁上或者火车上被断断续续的网络折 ...

  8. [P5665][CSP2019D2T2] 划分

    先说说部分分做法吧 1.\(n \leq 10\) 指数级瞎草都可以2333 2.\(n \leq 50\) 好像并没有什么做法-也许给剪枝的人部分分吧 3.\(n \leq 400\) 这个复杂度是 ...

  9. linq to sql 获取sql与参数添加到日志中

    这里的linq to sql并未使用ef 主要有以下内容 1.新增 2.修改 3.删除 4.查询 1.新增,修改,删除获取sql语句通过DataContext.Log获取执行的sql语句 String ...

  10. java流程控制结构

    一.流程控制分三类 1. 顺序结构 - 程序是从上往下,从左往右执行 2. 选择结构(判断结构) - if语句 A. if(关系表达式){语句体} - 执行流程:成立就执行语句体,不成立就不执行 B. ...