Unity 3D中使用泛型

目录

      • 泛型所提供的好处有以下3点
      • C#提供的泛型机制主要可以分为以下两种形式
      • Mono运行时对泛型机制的优化
      • 泛型委托
      • 泛型委托中的泛型类型参数可以是以下3种中的其中一种:
      • 什么是泛型约束
      • 泛型约束一共有6种:
      • 泛型中的类型约束的几种形式
      • 类型约束的组合
          • 合法的约束组合
          • 不合法的约束组合
      • 泛型的类型推断

C#2所带来的最重要的一个功能就是引入了泛型。

泛型所提供的好处有以下3点

  1. 类型安全:使用泛型类型或泛型方法来操作一个具体的数据类型时,编译器能够理解开发人员的意图,并且保证只有与制定数据类型兼容的对象才能用于该泛型类型或泛型方法。当使用不兼容类型的对象时,则会造成编译错误,甚至是在运行时抛出异常。例如在上面的代码中,对一个声明了操作类型为string的列表添加int型数据时,编译器会报错。
  2. 更加清晰的代码:正如本章开始所说的,在没有引入泛型机制的C#1的时代,源代码中不得不进行的强制类型转换次数是很多的,因此代码相对不易维护和拓展。在引入了泛型机制后,源代码中不必进行很多强制类型转换,因此代码变得更加容易维护。例如在上面的代码中,将List<T>中索引为0的元素取出来,并且赋值给一个stirng型的变量s的过程并没有强制类型转换。
  3. 更加优秀的性能:同样在本章开始就提到过的,如果没有泛型机制的话,为了使用同一套常规化的逻辑方法,则必须使用object作为参数或返回值的类型。但一个不得不承认的事实是,object类型其本身其实是一个很“没有用”的存在,这是由于如果要使用object做一些真正具体有意义的事情,则几乎不得不进行强制类型转换,转换成目标类型。同时,由于object是引用类型,当实际操作类型是值类型时,则又面临另一个十分影响性能的操作——装箱操作。Mono运行时将不得不在调用该逻辑方法之前对值类型实例进行装箱。但是,引入泛型机制后,由于能够通过该机制创建一个泛型类型或泛型方法来操作值类型,因此值类型的实例就无须执行装箱操作,反而可以直接通过传值的方式来传递了。与此同时,由于无须进行强制类型转换,因此在Mono运行时无须去验证这种转型是否类型安全。泛型机制使得大量的安全检查从运行时转移到了编译时进行,因此提高了代码的运行速度。

C#提供的泛型机制主要可以分为以下两种形式

  1. 泛型类型:包括类、接口、委托以及结构(值类型),但是需要注意的是并不包括泛型枚举。
  2. 泛型方法

Mono运行时对泛型机制的优化

Mono运行时内部采用了一套优化机制来避免这种情况的发生,也就是使某个编译后的“方法/实参类型”组合能够复用。假如某个特定的类型是某个泛型方法的类型实参,该“方法/实参类型”组合只需要被编译一次,之后再调用该方法就不需要再次编译了。例如一个Dictionary<string, int>被编译一次,之后代码中再出现Dictionary<string, int>就不需要编译了。
另一个优化,就是它认为所有的引用类型的实参都是完全相同的,这是因为所有的引用类型的实参,甚至是变量都是指向托管堆上某个对象的指针,因此可以采用统一的方式来处理。例如,List<String>和List<Stream>的代码编译之后都是相同的,因为它们的类型实参String和Stream都是引用类型。但是与此相反的是,如果类型实参是值类型,则必须单独编译成原生代码。

泛型委托

泛型委托中需要特别指出的一点是,泛型委托类型实参的逆变性和协变性。

泛型委托中的泛型类型参数可以是以下3种中的其中一种:

  1. 不变量:即泛型类型参数无法更改。
  2. 逆变量:即泛型类型参数可以从一个类更换为该类的某个派生类。在C#游戏脚本中使用关键字in来标识一个泛型类型参数是逆变量。需要注意的是,逆变量泛型参数只能出现在传入的位置,例如方法的参数。
  3. 协变量:即泛型类型参数可以从一个类更换为该类的某个基类。在C#游戏脚本中使用关键字out来标识一个泛型类型参数是协变量。需要注意的是,协变量泛型参数只能出现在输出的位置,例如方法的返回值的类型。

什么是泛型约束

让泛型的类型有一定的限制
关键字:where

泛型约束一共有6种:

  1. 值类型 where 泛型字母:struct
  2. 引用类型 where 泛型字母:class
  3. 存在无参公共构造函数 where 泛型字母:new()
  4. 某个类本身或者其派生类 where 泛型字母:类名
  5. 某个接口的派生类型 where 泛型字母:接口名
  6. 另一个泛型类型本身或者派生类型 where 泛型字母:另一个泛型字母

泛型中的类型约束的几种形式

  • 第1种约束——引用类型约束 引用类型约束是常见的一种约束形式。它保证了使用的类型实参必须是引用类型的。写作“T : Class”且必须是类型参数的第一个约束。指定了引用类型约束后,类型实参只能是类、接口、数组、委托等引用类型。
  • 第2种约束——值类型约束 值类型约束和引用类型约束对应,它保证了类型实参必须是值类型,写作“T : struct”。指定了值类型约束后,类型实参只能是结构、枚举等值类型。
  • 第3种约束——构造函数类型约束 顾名思义,构造函数类型约束主要用来检查类型实参是否有可用于创建类型实例的无参数构造函数,写作“T : new()”且必须是类型参数的所有约束的最后一个。构造函数类型约束经常被用在工厂风格的设计模式中,在这种模式中,一个对象会在需要时创建另一个对象。
  • 第4种约束——转换类型约束 转换类型约束的特点是指定的类型实参的类型必须可以通过一致性转换引用转换,甚至是装箱来转换为约束的类型。虽然转换类型约束只能指定一个类,但是却可以指定多个接口。

类型约束的组合

让我们将一组类型约束的组合中的约束划分一下,可以得到几个分类,分别是主要约束、次要约束,以及构造函数约束

  • 主要约束包括引用类型约束、值类型约束,以及指定为类的转换类型约束
  • 次要约束则包括接口其他类型参数的转换类型约束
  • 这样我们的类型约束组合的组成就变得十分清晰了,主要约束是可选的,但只能有一个;次要约束可以有多个
  • 构造函数约束也是可选的,只不过当主要约束是值类型约束时就不再需要构造函数约束了。
合法的约束组合
  • class Example<T> where T : class, IComparab<T>, IDisposable, new()
  • class Example<T> where T : struct,IDisposable。
  • class Example<T, U> where T : struct where U : class.
  • class Example<T, U> where T : String where U : IComparable<T>
不合法的约束组合
  • class Example<T> where T : class, struct.
  • class Example<T> where T : struct, new().
  • class Example<T> where T : new(), Stream.
  • class Example<T> where T : IDisposable, Stream.
  • class Example<T, U> where T : struct where U : class, T.

泛型的类型推断

C#中类型推断的基本步骤。

  1. 对于方法中的每一个方法实参(不是类型实参),都进行推断来确定其类型。
  2. 验证上一步中的所有方法实参的类型都是一致的,如果从一个方法实参推断出的类型实参和从另一个方法实参推断出的类型实参不一致,那么这次方法调用的类型推断便是失败的。
  3. 验证泛型方法所需要的所有类型实参都已经被推断出来。让编译器推断一部分,而自己显式的指定一部分是不被允许的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PS学习-抠图-蒙版-冰块酒杯等透明物体

选中图&#xff0c;ctrlA 全选 ctrlC复制 创建一个蒙版图层 选中蒙版Alt 点击进入 ctrlv 复制 ctrli 反转 原图层 ctrldelete填充为白色 添加一个背景&#xff0c;这个方法通用 首选创建一个 拖到最底部 给它填充颜色 这个可能是我图片的原因。视频是这样做的

五子棋小游戏(sut实验报告)

实验目的 实现人与人或人与电脑进行五子棋对弈 实验内容 启动游戏&#xff0c;显示游戏参数设置界面&#xff0c;用户输入参数后进入游戏界面&#xff0c;显示棋盘及双方博弈过程&#xff0c;游戏过程中可选择退出游戏。判定一方获胜后结束本局游戏&#xff0c;可选择继续下…

Mysql挂掉怎么办

思路 从库处理&#xff0c;relaylog&#xff0c;讲从库升级主库。 待主机恢复后&#xff0c;主机替换为从库。 具体操作 简介&#xff1a; 主库宕机 Master DOWN机-企业场景一主多从宕机从库切换主继续和从同步过程详解 登陆从库&#xff0c;show processlist; 查看两个线…

20个最佳ChatGPT博客写作提示

20 Best ChatGPT Prompts for Blog Writing 在数字化时代&#xff0c;内容为王&#xff0c;持续产出高质量、吸引人的博客文章是任何作家、营销人员或企业主的重要技能。随着对新鲜和相关性内容的需求不断增长&#xff0c;挑战往往在于生成想法、构建文章结构&#xff0c;并确…

Fiddler抓不到包

fiddler该设置的设置好之后&#xff0c;为啥就是抓不到包 以下都是以谷歌浏览器为例子 方法一&#xff1a; 将fidder证书导入到浏览器&#xff0c;设置搜索证书-->安全-->管理证书 这里可以看到将证书导入之后样子&#xff0c;名字为&#xff1a;DO_NOT_TRUST_Fiddler…

Linux操作系统裸机开发-环境搭建

一、配置SSH服务 1、下载安装ssh服务输入以下命令 sudo apt-get install nfs-kernel-server portmap2、建立一个供SSH服务使用的文件夹如以下命令 mkdir linux 3、完成前两步之后需要将其文件路径放到/etc/exports文件里输入以下命令&#xff1a; sudo vi /etc/esports 4.打…

线性回归 quickstart

构建一元一次方程 100个&#xff08;X, y &#xff09;&#xff0c;大概是’y3x4’ import numpy as npnp.random.seed(42) # to make this code example reproducible m 100 # number of instances X 2 * np.random.rand(m, 1) # column vector y 4 3 * X np.random…

最详细数据仓库项目实现:从0到1的电商数仓建设(数仓部分)

1、数仓 数据仓库是一个为数据分析而设计的企业级数据管理系统&#xff0c;它是一个系统&#xff0c;不是一个框架。可以独立运行的&#xff0c;不需要你参与&#xff0c;只要运行起来就可以自己运行。 数据仓库不是为了存储&#xff08;但是能存&#xff09;&#xff0c;而是…

创业板指399006行情数据API接口

# 测试&#xff1a;返回不超过10条数据&#xff08;2年历史&#xff09; https://tsanghi.com/api/fin/index/CHN/daily?tokendemo&ticker399006&order2Python示例 import requestsurl f"https://tsanghi.com/api/fin/index/CHN/daily?tokendemo&ticker399…

EtherCAT 开源主站 IGH 在 linux 开发板的移植和伺服通信测试

手边有一套正点原子linux开发板imax6ul&#xff0c;一直在吃灰&#xff0c;周末业余时间无聊&#xff0c;把EtherCAT的开源IGH主站移植到开发板上玩玩儿&#xff0c;搞点事情做。顺便学习研究下EtherCAT总线协议及其对伺服驱动器的运动控制过程。实验很有意思&#xff0c;这里总…

【JDBC编程】 Java程序操作数据库

目录 一、数据库编程的必备条件 二、什么是JDBC&#xff1f; 三、JDBC的使用 1. 准备工作 2. 建立数据库连接 2.1 加载驱动程序 2.2 数据库连接池技术 3. 正式操作 四、JDBC的局限性与MyBatis的优势 一、数据库编程的必备条件 编程语言&#xff0c;如Java&#xff0…

[M贪心] lc2789. 合并后数组中的最大元素(贪心+思维)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;2789. 合并后数组中的最大元素 2. 题目解析 挺有意思的一道题目。 这里的两数字合并&#xff0c;实际上就是两个数字之和变成了新的数字&#xff0c;再用这个数字和将这两个数字在数组中进行替代。 将这两个…

如何将csv文件转换为markdown表格

要在 Markdown 格式中显示 CSV 文件作为表格&#xff0c;你可以使用 Markdown 表格语法&#xff0c;并根据 CSV 文件的内容构建表格。以下是一个示例 Python 脚本&#xff0c;演示了如何读取 CSV 文件并将其内容转换为 Markdown 表格&#xff1a; import csv# 读取 CSV 文件 c…

创业新手看过来!四招助你开启成功之旅

如果你每个月的薪资仅有几千块&#xff0c;还背负着债务的重担&#xff0c;家中的老少都期盼着你为他们撑起一片天&#xff0c;那么&#xff0c;你每日都可能为了如何打破这一困境而焦虑不安。不过&#xff0c;请稍安勿躁&#xff0c;今天我将为你提供四个建议&#xff0c;或许…

Transformer学习笔记(二)

一、文本嵌入层Embedding 1、作用&#xff1a; 无论是源文本嵌入还是目标文本嵌入&#xff0c;都是为了将文本中词汇的数字表示转变为向量表示&#xff0c;希望在这样的高维空间捕捉词汇间的关系。 二、位置编码器Positional Encoding 1、作用&#xff1a; 因为在Transformer…

解锁区块链游戏数据解决方案

作者&#xff1a;stellafootprint.network 随着区块链技术的日新月异&#xff0c;游戏行业正迎来一场革命&#xff0c;催生了区块链游戏的崛起。这一变革不仅为用户带来了全新的互动体验&#xff0c;也开辟了全新的盈利渠道。然而&#xff0c;在这一新兴领域&#xff0c;数据的…

html--花瓣

代码 <!DOCTYPE html> <html lang"en" ><head> <meta charset"UTF-8"> <title>Petals</title><link rel"stylesheet" href"css/style.css"></head><body><div class"…

Jpg图片变gif怎么操作?1分钟教你在线生成

jpg是一种常见的图像文件格式&#xff0c;它使用有损压缩算法来减小文件大小。这意味着JPG图像可以在保持较高质量的同时减小文件大小&#xff0c;但会导致一些细节的损失。JPG图像适用于存储照片和其他需要高质量图像的场景。而GIF是一种支持动画的图像文件格式。与JPG不同&am…

【类脑智能】脑网络通信模型分类及量化指标(附思维导图)

脑网络通信模型分类及量化指标(附思维导图) 参考论文&#xff1a;Brain network communication_ concepts, models and applications 概念 脑网络通信模型是一种使用图论和网络科学概念来描述和量化大脑结构中信息传递的模型。这种模型可以帮助研究人员理解神经信号在大脑内…

管理类联考–复试–政治--二十大--记忆宫殿

文章目录 整体记忆宫殿门床头柜床书桌阳台 口诀记忆法 整体 记忆宫殿 要有逻辑的放到房间了 何为逻辑&#xff0c;如下大佬总结的便是&#xff0c;或者可自行总结&#xff0c;有前后顺序&#xff0c;做事逻辑即可 第一步&#xff1a;将逻辑的点放到房间里的点&#xff0c;…