当前位置: 首页 > news >正文

Unity中值类型和引用类型及使用时的注意事项

什么是值类型,什么是引用类型,Unity中值类型有哪些,引用类型有哪些,使用时需要注意些什么?

一、值类型和引用类型的概念

  • A. 值类型
    值类型是指变量直接存储其值的数据类型,变量的值被保存在栈中,每个变量都有自己的内存空间,它们不与其他变量共享。值类型包括基本数据类型(如 int、float、bool 等)和结构体(如 Vector3、Quaternion 等)。

  • B. 引用类型
    引用类型是指变量存储对象的引用(即指向对象的内存地址)的数据类型,变量的值被保存在堆中,多个变量可以引用同一个对象,它们共享对象的内存空间。引用类型包括类、接口、委托、数组等。

  • C. 额外信息:值传递和引用传递

(1)值传递是指将变量的值复制一份传递给函数或方法的参数,函数或方法内部对参数进行修改不会影响原始变量。比喻:主任让医生给10个人看病,值传递就是10个人已经在门口等待了,医生只需要按照顺序一个一个地诊断和治疗,不需要知道这些病人的身份信息。

(2)引用传递是指将变量的引用(即内存地址)传递给函数或方法的参数,函数或方法内部对参数进行修改会影响原始变量。比喻:引用传递就是给你10个人的身份证信息,你可以根据身份证信息来叫号,这样你可以直接找到对应的病人并对他们进行治疗。

值传递和引用传递在编程中都有自己的应用场景,需要根据具体情况选择合适的传递方式。

二、值类型和引用类型的区别

值类型引用类型
存储变量直接存储其值变量存储对象的引用
存储位置
独立性多个变量独立,不会相互影响多个变量可以引用同一个对象
包括基本数据类型和结构体类、接口、委托、数组等
传递值传递引用传递
复制赋值操作会复制变量的值赋值操作会复制引用,指向同一对象
内存管理由编译器自动管理需要手动管理内存,否则可能出现内存泄漏

三、Unity 中常见的值类型和引用类型

A. 值类型

  1. bool
  2. char
  3. int
  4. float
  5. double
  6. struct
    B. 引用类型
  7. string
  8. object
  9. class
  10. interface
  11. delegate
  12. 数组
  13. List
  14. Dictionary
  15. GameObject
  16. Component
  17. Transform
  18. 等等

四、值类型和引用类型在 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中值类型和引用类型及使用时的注意事项

什么是值类型&#xff0c;什么是引用类型&#xff0c;Unity中值类型有哪些&#xff0c;引用类型有哪些&#xff0c;使用时需要注意些什么&#xff1f; 一、值类型和引用类型的概念 A. 值类型 值类型是指变量直接存储其值的数据类型&#xff0c;变量的值被保存在栈中&#xff0…...

PM510V16 3BSE008358R1嵌入式卡件用于励磁系统多用于工业发电

​ PM510V16 3BSE008358R1嵌入式卡件用于励磁系统多用于工业发电 物联网与工业自动化控制系统的联系 当今&#xff0c;物联网可谓是在各大媒体出镜率最高、而且与“智能”联系密切的名词之一。从“管理、控制、智能”的角度来看&#xff0c;其实物联网与工业自动化是一脉相承的…...

AI 这是要杀疯啦!

ChatGPT 是基于 GPT 系列大模型开发出来的一个对话场景的 Demo&#xff0c;它已经让我们见识到了大模型的威力。 但有些开发者的胃口不满足于此&#xff0c;已经开始尝试“突破” AI 的边界了&#xff0c;本文推荐 5 个人工智能的开源项目。其中前两个项目&#xff0c;让人细思…...

【精品示例】超实用Python爬虫入门实例——做一个优质舔狗

引言 最近发现了一个有意思的网站&#xff0c;里面充斥了大量的舔狗箴言。作为一个爬虫发烧友怎么能错过此等机会&#xff0c;咱们直接就是上才艺&#xff01; 类的编写 本次爬虫使用了多协程的方案进行&#xff0c;保证了爬虫的速度。在这里我们新建一个爬虫类&#xff0c;…...

TCP流量控制与拥塞控制

什么是流量控制 一条TCP连接的每一侧主机都为该连接设置了接收缓存。当该TCP连接接收到正确的、有序的报文段&#xff0c;就会将数据放入接收缓存。相关联的应用会从缓存中读取数据。 如果发送者发送数据过快、过多&#xff0c;而接收方的应用程序从缓冲区读取的速度较慢&…...

Java_异常

Java_异常 1.什么是异常 ​ 生活中的异常&#xff1a;感冒发烧、电脑蓝屏、手机死机等。 ​ 程序中的异常&#xff1a;磁盘空间不足、网络连接中断、被加载的资源不存在等。 ​ 程序异常解决办法&#xff1a;针对程序中非正常情况&#xff0c;Java语言引入了异常&#xff0…...

自动化工具 接口自动化测试引擎

一、前言&#xff1a; 1、解决痛点&#xff1a;接口自动化测试用例需要人去开发、去维护。 2、实现第一性原理&#xff1a;根据定义的测试策略自动生成接口测试用例。 二、引擎优势&#xff1a; 1、提升人效&#xff1a;降低传统方式中接口测试开发与维护的工作量。 2、覆盖更…...

十三、详解Kubernetes的存储管理器

Kubernetes是一个开源的容器编排系统,它可以自动化地管理容器的部署、扩展和运维。在Kubernetes中,存储管理器是一个重要的组件,它负责管理容器的存储资源,包括持久化存储和临时存储。 Kubernetes的存储管理器主要有以下几个功能: 提供持久化存储:Kubernetes的存储管理器…...

java版 工程管理系统源码之提高工程项目管理软件的效率

高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中&#xff0c;管理不畅以及不良的项目执行&#xff0c;往往会导致项目延期、成本上升、回款拖后&#xff0c;最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统&#xff0c;确保…...

VMware 安装 MS-DOS7.10 并配置网络

VMware 安装 MS-DOS7.10 并设置软盘共享 1. 新建虚拟机2. 开机2.1. 这几个地方都可以开机2.2. 手速慢&#xff0c;进不了BIOS的朋友可以点这里 安装 MS-DOS7.101. 先选 1 安装 MS-DOS7.10 回车2. 欢迎页面&#xff0c;客气一下而已&#xff0c;继续 Next3. 继续王婆卖瓜4. 这步…...

嵌入式51单片机04-矩阵按键系列

文章目录 矩阵按键一、矩阵按键基础知识二、矩阵按键系列代码1. 矩阵按键操作&#xff08;显示数字&#xff09;&#xff08;1&#xff09;仿真电路图&#xff08;2&#xff09;源代码&#xff08;3&#xff09;实验结果 2. 矩阵按键操作&#xff08;控制数码管&#xff09;&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&#xff1a;VALUES的方式添加 1.3 方式2&#xff1a;将查询结果插入到表中 2. 更新数据 3. 删除数据 4. MySQL8新特性&#xff1a;计算列 5. 综合案例 6. 课后练习 练习1 练习2 1. 插入数据 1.1 实际问题 解决方式&#x…...

IDEA插件-MavenHapler

1.安装Maven Helper Maven Helper 是 IntelliJ IDEA 中的一个插件&#xff0c;可以帮助您管理 Maven 依赖项。它可以帮助您更容易地删除不再需要的依赖项&#xff0c;查看依赖项的冲突&#xff0c;以及执行其他有关 Maven 依赖项的操作。 打开 IDEA 设置页面&#xff1a; 在插…...

getaddrinfo调用crash 的debug过程

前两天&#xff0c;产线报一例crash问题。拿到core文件后&#xff0c;栈展开信息&#xff1a; (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插件 实现步骤 针对以上两个问题&#xff0c;分步解决 问题一&#xff1a;IDEA社区版没有创建…...

C++ [STL-简介]

本文已收录至《C语言和高级数据结构》专栏&#xff01; 作者&#xff1a;ARMCSKGT ​​​​​​​​ 文章目录 前言正文简介关于STL各种版本 STL组件容器迭代器配接器(适配器)算法仿函数空间配置器 STL的重要性学习STL的意义如何学习STL STL的缺陷 最后 前言 STL(standard tem…...

牛客前端编程语言错题2

【语法】 名为“ctx”的变量是某个HTML5画布对象的上下文。以下代码绘制的是什么&#xff08;&#xff09; Ctx.arc(x,y,r,0,Math.PI,true); 在给定点绘制一个矩形 从一个点到另一个点绘制一条直线 在给定点绘制一个半圆 在给定点绘制一个圆 链接&#xff1a;https://www.now…...

【C语言】基础语法3:控制流程结构

上一篇&#xff1a;运算符和表达式 下一篇&#xff1a;函数和递归 ❤️‍&#x1f525;前情提要❤️‍&#x1f525;   欢迎来到C语言基本语法教程   在本专栏结束后会将所有内容整理成思维导图&#xff08;结束换链接&#xff09;并免费提供给大家学习&#xff0c;希望大家…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...