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

深入解析C#数组协变与克隆机制

—— 值类型与引用类型的内存行为差异

🔍 一、数组协变(Array Covariance)

核心条件:

  • 仅适用于引用类型数组
  • 被赋值对象与数组基类型需存在隐式/显式转换关系
class Animal {}
class Dog : Animal {}Animal[] animals = new Dog[3];  // 合法协变:Dog[] 可赋值给 Animal[]

✅ 本质原因:

派生类(如Dog)可安全向上转型为基类(Animal),编译器允许此操作(图1演示内存布局):
⚠️ 重要限制

int[] intArr = new long[3];  // 错误!值类型数组不支持协变 

⚙️ 二、数组继承的核心成员

所有C#数组派生自System.Array,常用成员如下:

成员作用示例
Length获取数组总元素数量arr.Length → 5
Rank获取数组维度arr.Rank → 1 (一维)
GetLength(int)获取指定维度元素数量arr.GetLength(0) → 5
Sort()原地排序数组Array.Sort(arr)
Reverse()反转数组元素顺序Array.Reverse(arr)
Clone()浅复制(核心!见下文) arr.Clone()

⚠️ 三、Clone() 的浅复制行为

Clone() 仅复制数组容器本身,不递归复制元素对象,导致值类型与引用类型表现迥异:

▫️ 值类型数组克隆(独立副本)

int[] arr1 = { 1, 2, 3 };
int[] arr2 = (int[])arr1.Clone();arr2[0] = 100;  // 修改不影响 arr1

✅ 内存结果:

→ 产生两个完全独立的数组

▫️ 引用类型数组克隆(共享对象)

class Item { public int Value; }
Item[] items1 = { new Item() };
Item[] items2 = (Item[])items1.Clone();items2[0].Value = 100;  // 修改影响 items1[0]!

✅ 内存结果:

→ 两个数组指向同一组对象

💎 四、关键结论

  • 协变安全性:仅引用类型数组支持协变,依赖继承链的隐式转换
  • 克隆陷阱:
    • 值类型数组克隆 → 完全独立副本
    • 引用类型数组克隆 → 共享元素对象(需警惕副作用!)
  • 操作规范:
    • 修改克隆后的值类型数组安全无冲突
    • 修改引用类型数组元素前,需深度复制元素对象(例如手动new实例)

行动提示:处理引用类型数组时,若需完全隔离数据,应实现深拷贝(如序列化/手动复制对象),而非依赖Clone()。

http://www.dtcms.com/a/256746.html

相关文章:

  • Mybatis-Plus支持多种数据库
  • Netty内存池核心:PoolChunk深度解析
  • 给同一个wordpress网站绑定多个域名的实现方法
  • C#Halcon从零开发_Day11_圆拟合
  • vim学习流程,以及快捷键总结
  • Docker 运行RAGFlow 搭建RAG知识库
  • Linux下QGIS二次开发环境搭建
  • 【投稿与写作】overleaf 文章转投arxiv流程经验分享
  • LeetCode 每日一题 2025/6/16-2025/6/22
  • 【DDD】——带你领略领域驱动设计的独特魅力
  • winform mvvm
  • 案例练习二
  • Unity3D 屏幕点击特效
  • 【前后前】导入Excel文件闭环模型:Vue3前端上传Excel文件,【Java后端接收、解析、返回数据】,Vue3前端接收展示数据
  • 「Linux文件及目录管理」vi、vim编辑器
  • Azure Devops
  • 【递归,搜索与回溯算法】记忆化搜索(二)
  • 深度实战|星环OS三大创新场景解密:如何用确定性技术重构智能汽车安全与体验?
  • 【旧题新解】第 20 集 输出保留 3 位小数的浮点数
  • 解决qt.qpa.plugin: Could not find the Qt platform plugin “windows“ in ““ ...
  • MySQL安装与配置【windowsMac】
  • 15.3 LLaMA 3+LangChain实战:智能点餐Agent多轮对话设计落地,订单准确率提升90%!
  • B004基于STM32F401单片机简易交通灯实训数码管显示设计仿真资料
  • Vue3解析Spring Boot ResponseEntity
  • Day39 图像数据与显存
  • 关于uniapp解析SSE响应数据的处理
  • 如何用AI开发完整的小程序<7>—让AI微调UI排版
  • jxWebUI--系统说明
  • 企业级安全实践:SSL 加密与权限管理(二)
  • 云原生/容器相关概念记录