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语言基本语法教程 在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
