C#中ArrayList运行机制及其涉及的装箱拆箱

C#中ArrayList运行机制及其涉及的装箱拆箱

    • 1.1 基本用法
      • 1.1.1 属性
      • 1.1.2 方法
    • 1.2 内部实现
    • 1.3 装箱
    • 1.4 拆箱
    • 1.5 object对象的相等性比较
    • 1.6 总结
    • 1.7 其他简单结构类

人物

1.1 基本用法

命名空间: using System.Collections;

1.1.1 属性

Capacity:获取或设置 ArrayList 可包含的元素数目。
Count:获取 ArrayList 中实际包含的元素数目。
Item[Int32]:获取或设置指定索引处的元素。

1.1.2 方法

Add(Object):向 ArrayList 的末尾添加一个元素。
AddRange(ICollection):向 ArrayList 的末尾添加元素集合。
Clear():移除所有元素。
Contains(Object):判断 ArrayList 是否包含特定元素。
IndexOf(Object):返回某个元素在 ArrayList 中的索引。
Insert(Int32, Object):在指定索引位置插入一个元素。
Remove(Object):移除特定元素的第一个匹配项。
RemoveAt(Int32):移除指定索引处的元素。
Sort():对 ArrayList 的元素排序。
ToArray():将 ArrayList 转换为数组。

1.2 内部实现

  • ArrayList 是一个非泛型集合,它可以存储任何类型的对象,本质上是一个object类型的数组;
  • 类似于List,其初始capacity为0,后依次动态扩容为4 8 16 32……;
  • 动态扩容是一项昂贵的操作,因为它涉及到创建新数组和复制元素,需要不断的GC;
  • 如果事先知道大概需要存储的元素数量,预先设置一个合理的容量可以提高性能;
  • 存储值类型元素时:装箱
  • 将值类型元素取出来转换使用时:拆箱
ArrayList array1 = new ArrayList();
WriteLine(array1.Capacity); //输出0(初始容量为0)array1.Add(1);
WriteLine(array1.Capacity); //输出4(首次扩容到4)array1.Add("two");
array1.Add(3);
array1.Add("four");
array1.Add(5);WriteLine(array1.Capacity); //输出8(再次扩容到8)

1.3 装箱

是一个将值类型转换为对象类型的过程,涉及到从栈(值类型通常存储的位置)到堆(引用类型存储的位置)的数据复制。大致步骤:

  • 当发生装箱时,.NET 运行时在堆上为该值类型分配内存。
  • 接着,它将值类型的内容复制到堆上分配的这块内存中。
  • 之后,引用类型变量(例如 object)会指向堆上的这个新位置。

1.4 拆箱

拆箱是将引用类型转换回其原始的值类型的过程。拆箱过程涉及从堆到栈的数据复制。大致步骤:

  • 拆箱操作首先检查引用类型实例是否确实指向先前装箱的值类型。
  • 如果类型匹配,它会从堆上的对象中复制值回栈上的值类型变量。
  • 如果类型不匹配,会抛出 InvalidCastException。

1.5 object对象的相等性比较

== 用于判断两个对象引用是否指向同一个对象实例,即它们在内存中的地址是否相同;
Equals 方法用于比较两个对象的值或内容是否相等。这被称为值相等性。

1.6 总结

装箱和拆箱操作都涉及内存分配和数据复制,这在性能上有一定的成本。特别是在频繁执行这些操作的情况下,性能影响可能更为显著。

由于 ArrayList 是一个非泛型集合,它可以存储任何类型的对象。但这种类型的不确定性会导致运行时错误,并且需要频繁的类型转换。因此,在需要存储不同类型数据的场景中可以使用 ArrayList,但现代的 .NET 开发中,推荐使用泛型集合,如 List< T >,因为它们提供了类型安全和更好的性能。

随着泛型的普及,可以通过使用泛型集合(如 List< T >)来避免许多不必要的装箱和拆箱操作。

1.7 其他简单结构类

ArrayList、Queue、Hashtable等也是类似的:

  • 都位于命名空间:using System.Collections;
  • 内部使用object数组实现,所以元素可以是任意类型。这会导致装箱、拆箱的问题,带来性能开销。
  • 都有对应的更加安全的泛型类,例如Stack< T >、Queue< T >、HashSet< T >。

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

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

相关文章

江苏省力学学会副理事长钱向东、邬萱一行来访天洑软件

近日&#xff0c;江苏省力学学会副理事长钱向东、邬萱率调研组一行来访天洑软件。 会上&#xff0c;双方就平台建设、成果转化、产品研发、品牌宣传、人才培养等方面开展了广泛深入的交流。江苏省力学学会副理事长钱向东、邬萱&#xff0c;分享了学会的平台优势和资源优势以及…

IP地址和端口

1. IP地址&#xff1a; 简介&#xff1a; IP 协议是为计算机网络相互连接进行通信而设计的协议。在因特网中&#xff0c;它是能使连接到网上的所 有计算机网络实现相互通信的一套规则&#xff0c;规定了计算机在因特网上进行通信时应当遵守的规则。任 何厂家生产的计算机系统…

python 进程

1创建一个爬虫程序 import requests urls [https://www.cnblogs.com/#p{page}for page in range(1, 501) ]def craw(url):r requests.get(url)print(url, len(r.text))craw(urls[0])2定义单进程和多进程 import blob_spider import threading import timedef single_thread…

ubuntu20安装网络调试助手遇到缺少qt4相关库的问题

最近需要做套接字通讯的工作&#xff0c;最好是有一个网络调试软件能够接受或者发送套接字&#xff0c;测试代码能够正常通讯。windows下有很多&#xff0c;但是linux下比较少&#xff0c;使用广泛的是下面这一款。 1、安装 首先从网盘&#xff08;链接: https://pan.baidu.c…

dom-to-image-more 使用

与网上不同的使用方式&#xff1a; 官网 dom-to-image-more - npm 这里不会出现两行缩略不行的bug yarn add dom-to-image-more 下面 生成图片并下载图片 const picture ref() const dom2img () > {var node picture.valuedomtoimage.toPng(node, { cacheBust: t…

LabVIEW高级CAN通信系统

LabVIEW高级CAN通信系统 在现代卫星通信和数据处理领域&#xff0c;精确的数据管理和控制系统是至关重要的。设计了一个基于LabVIEW的CAN通信系统&#xff0c;它结合了FPGA技术和LabVIEW软件&#xff0c;主要应用于模拟卫星平台的数据交换。这个系统的设计不仅充分体现了FPGA在…

C# 使用屏障来使多线程并发操作保持同步

写在前面 以下是微软官方对屏障类的介绍&#xff0c;System.Threading.Barrier 可用来作为实现并发同步操作的基本单元&#xff0c;让多个线程(参与者)分阶段并行处理目标算法。在达到代码中的屏障点之前&#xff0c;每个参与者将继续执行&#xff0c;屏障表示工作阶段的末尾&…

微信小程序调取相机实现拍照/录屏

1.效果 2.创建子组件 index.wxml代码 <xr-scene id"xr-scenecameraglb" ar-system bind:ready"handleReady" bind:ar-ready"handleARReady" > <!-- 初始化模型 --><xr-assets bind:loaded"handleAssetsLoaded">…

致远OA如何开发 第二篇

第二篇 开发环境以及工具 此栏目技术支持 技术大佬对栏目文章的支持 特别感谢 开发环境 win系统&#xff0c;linux系统&#xff0c;因为在安装的时候会判断是否符合标准服务系统&#xff0c;所以我们可以在安装的bat文件&#xff0c;或者shell文件中删除系统检测的代码&…

【Android】使用build.gradle.kt配置目标架构(abiFIlters)时报错 Val cannot be reassigned

一、 Groovy 配置abi 传统上我们会使用groovy语言的配置文件build.gradle来配置&#xff1a; 在app级别的build.gradle中的 android > defaultConfig 添加子项 ndk {abiFilters armeabi, armeabi-v7a, arm64-v8a, x86, x86_64 }二、出现错误的代码 新版本的默认使用kotli…

WhatsApp怎么营销引流?

随着移动互联网的普及&#xff0c;越来越多的企业开始利用社交媒体平台来进行推广和营销。其中&#xff0c;全球最流行的即时通讯软件之一 WhatsApp&#xff0c;为企业提供了一个新的营销渠道。但是&#xff0c;许多企业不知道如何利用 WhatsApp 进行营销引流。今天&#xff0c…

虚拟机网络配置及Moba工具的使用

A、设置IP和网关 1、设置IP [roothadoop00 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 &#xff08;修改如下标红内容&#xff0c;没有的就添加&#xff09; DEVICEeth0 HWADDR08:00:27:BD:9D:B5 #不用改 TYPEEthernet UUID53e4e4b6-9724-43ab-9da7-68792e611031…

淘宝镜像请求失败解决方法:request to https://registry.npm.taobao.org/vue-loader failed

npm install报错&#xff1a;request to https://registry.npm.taobao.org/vue-loader failed, reason: getaddrinfo ENOTFOUND registry.npm.taobao.org 解决&#xff1a;https://jingyan.baidu.com/article/acf728fd99b16ff8e510a301.html 查看镜像源&#xff1a;npm get re…

不停机迁移,TDengine 在 3D 打印技术中的“焕新”之路

小T导读&#xff1a;自 2021 年我们正式使用 TDengine 至今已接近三年&#xff0c;现在 TDengine 已经成熟应用于我们多个项目当中&#xff0c;凭借着强大的读写存储能力&#xff0c;为我司多项业务的核心数据保驾护航。近期我们团队刚好完成 TDengine 2.x 到 3.x 的数据迁移&a…

VAD语音分割算法详解

1 VAD算法介绍 1.1 语音基本概念 声波通过空气传播&#xff0c;被麦克风接收&#xff0c;通过采样、量化、编码转换为离散的数字信号&#xff0c;即波形文件。音量、音高和音色是声音的基本属性。 采样&#xff1a;原始的语音信号是连续的模拟信号&#xff0c;需要对语音进行…

2024区块链应用趋势,RWA实物资产化

作者 张群&#xff08;赛联区块链教育首席讲师&#xff0c;工信部赛迪特聘资深专家&#xff0c;CSDN认证业界专家&#xff0c;微软认证专家&#xff0c;多家企业区块链产品顾问&#xff09;关注张群&#xff0c;为您提供一站式区块链技术和方案咨询。 实物资产通证化&#xff0…

ffmpeg本地TS和M3U8播放流程及调试过程

本地TS播放过程 本地M3U8播放过程 http工作流程 http分两个步骤 1、获取m3u8文件&#xff0c;这个是在哪里开始读的&#xff1f; 2、获取data数据&#xff0c;这个是从http_read开始读&#xff0c;可以通过修改这里实现buffer数据和引擎对接 3、s->user_agent,s->off,…

Python tkinter (2) —— Button标签

Python的标准Tk GUI工具包的接口 目录 Button 简单示例 设置按钮宽高 设置响应事件 匿名函数调用事件 退出按钮 总结 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Button Button标签在窗口中显示按钮的控件。 简单示例 实现一个…

1.3编程基础之算术表达式与顺序执行

目录 前言1. AB问题2. 计算(ab)*c的值3. 计算(ab)/c的值4. 带余除法5. 计算分数的浮点数值6. 甲流疫情死亡率7. 计算多项式的值8. 温度表达转化9. 与圆相关的计算10. 计算并联电阻的阻值11. 计算浮点数相除的余数12. 计算球的体积13. 反向输出一个三位数14. 大象喝水15. 苹果和…

STM32 单片机重启(查看上次重启原因)

STM32 HAL 复位源识别 STM32启动后可以识别本次启动是对应哪一种复位源&#xff0c;从而可以根据复位源的状态&#xff0c;做一些特殊处理。 HAL库的复位源识别 以下代码&#xff0c;识别是那种方式进行复位的&#xff0c;只需要将自己在那种方式复位运行的程序添加进去即刻&a…