Unity中值类型和引用类型及使用时的注意事项
什么是值类型,什么是引用类型,Unity中值类型有哪些,引用类型有哪些,使用时需要注意些什么?
一、值类型和引用类型的概念
-
A. 值类型
值类型是指变量直接存储其值的数据类型,变量的值被保存在栈中,每个变量都有自己的内存空间,它们不与其他变量共享。值类型包括基本数据类型(如 int、float、bool 等)和结构体(如 Vector3、Quaternion 等)。 -
B. 引用类型
引用类型是指变量存储对象的引用(即指向对象的内存地址)的数据类型,变量的值被保存在堆中,多个变量可以引用同一个对象,它们共享对象的内存空间。引用类型包括类、接口、委托、数组等。 -
C. 额外信息:值传递和引用传递
(1)值传递是指将变量的值复制一份传递给函数或方法的参数,函数或方法内部对参数进行修改不会影响原始变量。比喻:主任让医生给10个人看病,值传递就是10个人已经在门口等待了,医生只需要按照顺序一个一个地诊断和治疗,不需要知道这些病人的身份信息。
(2)引用传递是指将变量的引用(即内存地址)传递给函数或方法的参数,函数或方法内部对参数进行修改会影响原始变量。比喻:引用传递就是给你10个人的身份证信息,你可以根据身份证信息来叫号,这样你可以直接找到对应的病人并对他们进行治疗。
值传递和引用传递在编程中都有自己的应用场景,需要根据具体情况选择合适的传递方式。
二、值类型和引用类型的区别
| 值类型 | 引用类型 | |
|---|---|---|
| 存储 | 变量直接存储其值 | 变量存储对象的引用 |
| 存储位置 | 栈 | 堆 |
| 独立性 | 多个变量独立,不会相互影响 | 多个变量可以引用同一个对象 |
| 包括 | 基本数据类型和结构体 | 类、接口、委托、数组等 |
| 传递 | 值传递 | 引用传递 |
| 复制 | 赋值操作会复制变量的值 | 赋值操作会复制引用,指向同一对象 |
| 内存管理 | 由编译器自动管理 | 需要手动管理内存,否则可能出现内存泄漏 |
三、Unity 中常见的值类型和引用类型
A. 值类型
- bool
- char
- int
- float
- double
- struct
B. 引用类型 - string
- object
- class
- interface
- delegate
- 数组
- List
- Dictionary
- GameObject
- Component
- Transform
- 等等
四、值类型和引用类型在 Unity 中的使用注意事项
A. 值类型
1、值类型在 foreach中使用时的注意事项
在 foreach中使用值类型时,需要注意它们是按值传递的,即每次迭代都会复制一份值。这可能会导致性能问题,尤其是在迭代大量值类型时。为了避免这种情况,可以将值类型转换为引用类型,或者使用索引访问数组,这样可以避免复制值。
2、值类型在 Linq 的 ForEach 方法中使用时的注意事项
在 Linq 的 ForEach 方法中使用值类型时,也需要注意值类型是按值传递的,因此每次迭代都会复制一份值。为了避免这种情况,可以使用 Select 方法将值类型转换为引用类型,或者使用 Linq 的 Select 和 ToArray 方法将值类型转换为数组。
B. 引用类型
1、引用类型在 foreach中使用时的注意事项
在 foreach中使用引用类型时,需要注意它们是按引用传递的,即每次迭代都会使用同一个对象。这可能会导致意外的修改,尤其是在多个迭代器访问同一个集合时。为了避免这种情况,可以使用 ToArray 方法将集合转换为数组,这样就可以创建一个新的数组,而不是使用同一个集合。
2、引用类型在 Linq 的 ForEach 方法中使用时的注意事项
在 Linq 的 ForEach 方法中使用引用类型时,也需要注意引用类型是按引用传递的。为了避免意外的修改,可以使用 ToArray 方法将集合转换为数组,或者使用 Linq 的 Select 和 ToArray 方法将集合中的对象复制到一个新的数组中。
3、避免空引用异常
在使用引用类型时,需要注意对象是否已被销毁,以免出现空引用的情况。
C、如何用一种有效的方法来读写值类型和引用类型的列表或者数组
- 迭代的时候,用下标
- 同时满足单线程和多线程
- 可读,可写
- 单线程模式:
// 获取列表的下标集合,使用lambda表达式将列表中每个元素的下标返回为集合中的元素
List<int> indices = list.Select((item, index) => index).ToList();// 对下标集合进行循环处理,对于每个下标,根据其在列表中的位置获取对应的元素值,并输出下标和元素值
indices.ForEach(index =>
{string value = list[index];//list[index] = ...Console.WriteLine($"Index: {index}, Value: {value}");
});
plinq的多线程模式:
// 创建一个包含字符串元素的列表
List<string> list = new List<string> { "apple", "banana", "orange", "pear" };// 创建一个索引集合,用于访问列表中的元素
List<int> indices = Enumerable.Range(0, list.Count).ToList();// 使用预先生成的索引集合,在并行处理列表时访问列表中的元素
indices.AsParallel().ForAll(index =>
{string item = list[index];Console.WriteLine($"Index: {index}, Value: {item}");
});
五、总结
值类型适用于存储简单的数据类型,如整数、浮点数和布尔值等。它们通常在栈上分配内存,并且具有较小的内存占用和较高的访问速度。
引用类型适用于存储复杂的数据类型,如类、数组和字符串等。它们通常在堆上分配内存,并且具有较大的内存占用和较慢的访问速度。引用类型允许对象在内存中动态分配和释放,因此更适合存储动态数据,如游戏中的角色和物体等。
如何用一种方法来实现快速的读写呢?
相关文章:
Unity中值类型和引用类型及使用时的注意事项
什么是值类型,什么是引用类型,Unity中值类型有哪些,引用类型有哪些,使用时需要注意些什么? 一、值类型和引用类型的概念 A. 值类型 值类型是指变量直接存储其值的数据类型,变量的值被保存在栈中࿰…...
PM510V16 3BSE008358R1嵌入式卡件用于励磁系统多用于工业发电
PM510V16 3BSE008358R1嵌入式卡件用于励磁系统多用于工业发电 物联网与工业自动化控制系统的联系 当今,物联网可谓是在各大媒体出镜率最高、而且与“智能”联系密切的名词之一。从“管理、控制、智能”的角度来看,其实物联网与工业自动化是一脉相承的…...
AI 这是要杀疯啦!
ChatGPT 是基于 GPT 系列大模型开发出来的一个对话场景的 Demo,它已经让我们见识到了大模型的威力。 但有些开发者的胃口不满足于此,已经开始尝试“突破” AI 的边界了,本文推荐 5 个人工智能的开源项目。其中前两个项目,让人细思…...
【精品示例】超实用Python爬虫入门实例——做一个优质舔狗
引言 最近发现了一个有意思的网站,里面充斥了大量的舔狗箴言。作为一个爬虫发烧友怎么能错过此等机会,咱们直接就是上才艺! 类的编写 本次爬虫使用了多协程的方案进行,保证了爬虫的速度。在这里我们新建一个爬虫类,…...
TCP流量控制与拥塞控制
什么是流量控制 一条TCP连接的每一侧主机都为该连接设置了接收缓存。当该TCP连接接收到正确的、有序的报文段,就会将数据放入接收缓存。相关联的应用会从缓存中读取数据。 如果发送者发送数据过快、过多,而接收方的应用程序从缓冲区读取的速度较慢&…...
Java_异常
Java_异常 1.什么是异常 生活中的异常:感冒发烧、电脑蓝屏、手机死机等。 程序中的异常:磁盘空间不足、网络连接中断、被加载的资源不存在等。 程序异常解决办法:针对程序中非正常情况,Java语言引入了异常࿰…...
自动化工具 接口自动化测试引擎
一、前言: 1、解决痛点:接口自动化测试用例需要人去开发、去维护。 2、实现第一性原理:根据定义的测试策略自动生成接口测试用例。 二、引擎优势: 1、提升人效:降低传统方式中接口测试开发与维护的工作量。 2、覆盖更…...
十三、详解Kubernetes的存储管理器
Kubernetes是一个开源的容器编排系统,它可以自动化地管理容器的部署、扩展和运维。在Kubernetes中,存储管理器是一个重要的组件,它负责管理容器的存储资源,包括持久化存储和临时存储。 Kubernetes的存储管理器主要有以下几个功能: 提供持久化存储:Kubernetes的存储管理器…...
java版 工程管理系统源码之提高工程项目管理软件的效率
高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中,管理不畅以及不良的项目执行,往往会导致项目延期、成本上升、回款拖后,最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统,确保…...
VMware 安装 MS-DOS7.10 并配置网络
VMware 安装 MS-DOS7.10 并设置软盘共享 1. 新建虚拟机2. 开机2.1. 这几个地方都可以开机2.2. 手速慢,进不了BIOS的朋友可以点这里 安装 MS-DOS7.101. 先选 1 安装 MS-DOS7.10 回车2. 欢迎页面,客气一下而已,继续 Next3. 继续王婆卖瓜4. 这步…...
嵌入式51单片机04-矩阵按键系列
文章目录 矩阵按键一、矩阵按键基础知识二、矩阵按键系列代码1. 矩阵按键操作(显示数字)(1)仿真电路图(2)源代码(3)实验结果 2. 矩阵按键操作(控制数码管)&am…...
某安全对抗行走APP逆向分析
1.定位url 抓包: https://api5.xxxx.com/xxx-rest-service/message/fun_getnearby 看一下参数: opentime:时间戳 reqdata:base64编码 sign 未知,需要解密 # -*- coding: utf-8 -*- # @Author : Codeooo # @Time : 2022-10-14import frida, sysm199a = "&qu…...
数据库基础篇 《11.数据处理之增删改》
目录 1. 插入数据 1.1 实际问题 1.2 方式1:VALUES的方式添加 1.3 方式2:将查询结果插入到表中 2. 更新数据 3. 删除数据 4. MySQL8新特性:计算列 5. 综合案例 6. 课后练习 练习1 练习2 1. 插入数据 1.1 实际问题 解决方式&#x…...
IDEA插件-MavenHapler
1.安装Maven Helper Maven Helper 是 IntelliJ IDEA 中的一个插件,可以帮助您管理 Maven 依赖项。它可以帮助您更容易地删除不再需要的依赖项,查看依赖项的冲突,以及执行其他有关 Maven 依赖项的操作。 打开 IDEA 设置页面: 在插…...
getaddrinfo调用crash 的debug过程
前两天,产线报一例crash问题。拿到core文件后,栈展开信息: (gdb) bt #0 0x00007f64a3651aff in raise () from /lib64/libc.so.6 #1 0x00007f64a3624ea5 in abort () from /lib64/libc.so.6 #2 0x00007f64a3694097 in __libc_message () …...
【Sql】sql语句练习随记
本文通过最经典的“学生-成绩-课程-教师”表来帮助练习sql语句。 STUDENT表 SNO 学号SNAME 姓名SSEX 性别SBIRTHDAY 生日CLASS 班级 SCORE表 SNO 学号CNO 课程编号DEGREE 分数 COURSE表 CNO 课程编号CNAME 课程名称TNO 教师编号 TEACHER表 TNO 教师编号TNAME 教师姓名TS…...
IDEA社区版搭建Tomcat服务器并创建web项目
IDEA社区版搭建Tomcat服务器并创建web项目 目标 创建Web项目的目录结构可以启动Tomcat服务器编写Servlet并访问成功 问题 IDEA社区版没有创建Web工程的选项IDEA社区版没有Tomcat插件 实现步骤 针对以上两个问题,分步解决 问题一:IDEA社区版没有创建…...
C++ [STL-简介]
本文已收录至《C语言和高级数据结构》专栏! 作者:ARMCSKGT 文章目录 前言正文简介关于STL各种版本 STL组件容器迭代器配接器(适配器)算法仿函数空间配置器 STL的重要性学习STL的意义如何学习STL STL的缺陷 最后 前言 STL(standard tem…...
牛客前端编程语言错题2
【语法】 名为“ctx”的变量是某个HTML5画布对象的上下文。以下代码绘制的是什么() Ctx.arc(x,y,r,0,Math.PI,true); 在给定点绘制一个矩形 从一个点到另一个点绘制一条直线 在给定点绘制一个半圆 在给定点绘制一个圆 链接:https://www.now…...
【C语言】基础语法3:控制流程结构
上一篇:运算符和表达式 下一篇:函数和递归 ❤️🔥前情提要❤️🔥 欢迎来到C语言基本语法教程 在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
