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语言基本语法教程 在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
