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

🔍 一、数组协变(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.pswp.cn/diannao/88026.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88026.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88026.shtml

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

相关文章

零散问题一

1.函数重载的原理 名称修饰(Name Mangling) 作用:编译器在编译时对函数名进行编码,生成唯一的内部标识符,使得同名函数能通过参数列表的差异被区分。示例: void func(int a); // 修饰后可能为 _Z4funcivo…

React Native【详解】内置 API

屏幕 Dimensions 获取屏幕信息 import { Dimensions } from "react-native"; export default function demo() {const { width, height, scale, fontScale } Dimensions.get("window");console.log(width, height, scale, fontScale); }参数为 window 时…

Selenium自动化测试常见的异常处理

在软件开发和测试领域,Selenium作为一种广泛使用的自动化测试工具,扮演着至关重要的角色。随着自动化测试的不断普及,如何在测试过程中有效捕获并处理异常,成为了每个测试工程师必须掌握的技能。本文旨在深入探讨Selenium异常处理的方法,通过丰富的案例和代码,帮助新手朋…

企业级安全实践:SSL 加密与权限管理(二)

权限管理:企业数据的守护者 权限管理的基本概念与重要性 权限管理,是指根据系统设置的安全规则或策略,用户可以访问且仅能访问自己被授权的资源,不多不少 。它是企业信息安全体系的重要组成部分,旨在确保只有授权的人…

AMAT P5000 CVDFDT CVDMAINT Precision 5000 Mark 操作 电气原理 PCB图 电路图等

AMAT P5000 CVDFDT CVDMAINT Precision 5000 Mark 操作 电气原理 PCB图 电路图等

深入浅出:语言模型中的“自回归生成”是什么?

在当今大语言模型(LLM)如 ChatGPT、GPT-4、文心一言、通义千问等风靡的时代,“自回归生成”是驱动它们流畅对话、创作文本的核心引擎。 理解它是深入掌握LLM工作原理的关键一步。本文将用清晰易懂的语言,结合实例,为你…

LLMs基础学习(八)强化学习专题(5)

LLMs基础学习(八)强化学习专题(5) 文章目录 LLMs基础学习(八)强化学习专题(5)重要性采样(Importance Sampling)权重计算逻辑两种实现形式使用注意事项 PPO 与…

深入理解“回调地狱“(Callback Hell)

"回调地狱"是异步编程中常见的问题,指由于过多嵌套的回调函数导致的代码难以理解和维护的情况。 一、什么是回调地狱 基本概念 回调地狱(Callback Hell/Pyramid of Doom)是指: 多层嵌套的回调函数形成的代码结构 代码向右缩进越来越深&…

Oracle 的 TCP.SEND_TIMEOUT 参数

Oracle 的 TCP.SEND_TIMEOUT 参数 一 参数基本概念 TCP.SEND_TIMEOUT 是 Oracle Net Services 中的一个重要参数,用于控制 TCP 数据发送操作的最长等待时间。 二 关键特性 特性说明参数类型sqlnet.ora 配置文件参数默认值none (无超时限制)单位ms, sec, min, 默…

[Nginx] 配置中的sendfile参数详解:从传统 IO 到零拷贝的性能优化

一、sendfile 是什么? sendfile 是 Nginx 中一个关键的配置参数,用于控制是否使用操作系统提供的 sendfile() 系统调用来传输文件。 sendfile on;:启用零拷贝技术,直接由内核将文件发送到网络。sendfile off;:使用传统…

(LeetCode 每日一题) 2138. 将字符串拆分为若干长度为 k 的组 (字符串、模拟)

题目&#xff1a;2138. 将字符串拆分为若干长度为 k 的组 思路&#xff1a;字符串模拟&#xff0c;时间复杂度0(n)。 C版本&#xff1a; class Solution { public:vector<string> divideString(string s, int k, char fill) {vector<string> v;int ns.size();for…

C++法则1:在 C++ 中,所有的具名变量都是左值,即使它们的类型是右值引用。

看下面例子&#xff1a; test(0)调用的是函数是&#xff1a; template<typename T> void test(T&& t) {std::cout << "右值引用" << std::endl; }test(n)调用的是函数是&#xff1a; template<typename T> void test(T& t) {st…

python如何使用正则提取文章所有形容词

在Python中使用正则表达式提取文章中的形容词需要结合语言特性处理。以下是分步解决方案&#xff1a; 英文场景解决方案&#xff08;推荐使用专业NLP库&#xff09;&#xff1a; import re import nltk nltk.download(averaged_perceptron_tagger) # 首次使用需要下载text …

低代码平台的数据归集及治理

低代码平台或无码平台&#xff0c;在建表单的时候&#xff0c;都是每一个表单一个json的格式文件&#xff0c;存储在Nosql数据库中。在开发的过程中&#xff0c;有以下主要的需求 1、json格式实时的转为关系数据库的格式&#xff0c;存入到关系数据库中 需要在流程结束的时候&…

Origin:如何使柱状图看起来悬空

想得到这样的一个没有下轴的柱状图&#xff0c;操作步骤如下: 1.点击下轴坐标轴 2.修改效果

Vite 原理深入剖析

1. 整体架构设计 Vite 的整体架构由几个关键模块组成,每个模块都对应具体的源码文件: 开发服务器:用于处理浏览器请求、模块解析和热更新。开发服务器的代码主要位于 src/node/server/index.ts。 模块解析与热更新:通过模块中间件拦截请求,处理代码转换与热模块替换。相关…

微处理器原理与应用篇---常见基础知识(5)

一、什么是嵌入式系统 嵌入式系统是一种以应用为中心、以计算机技术为基础、软硬件可裁剪的专用计算机系统&#xff0c;通常嵌入在其他设备中&#xff0c;用于实现特定功能。它广泛存在于消费电子、工业控制、汽车电子、医疗设备等领域&#xff0c;是现代智能设备的核心 “大脑…

Redis 8.0向量库 vs 传统向量数据库:大模型知识库开发选型全指南

在大模型知识库开发领域&#xff0c;向量数据库的选择直接影响系统的性能、扩展性和开发效率。随着Redis 8.0推出Vector Set数据结构并增强向量搜索能力&#xff0c;开发者面临新的选择困境&#xff1a;是采用传统专用向量数据库&#xff08;如Milvus、Pinecone&#xff09;&am…

偏向锁撤销为什么会触发STW?

偏向锁撤销触发STW&#xff08;Stop-The-World&#xff09;的根本原因在于其撤销操作需要​​全局内存一致性​​和​​线程状态确定性​​&#xff0c;具体机制如下&#xff1a; ⚙️ ​​一、偏向锁撤销的核心流程​​ ​​竞争触发撤销​​ 当线程B尝试获取已被线程A偏向的…

Java观察者模式详解

观察者模式(Observer Pattern)是一种行为型设计模式&#xff0c;它定义了对象之间的一对多依赖关系&#xff0c;当一个对象(主题)的状态发生改变时&#xff0c;所有依赖于它的对象(观察者)都会自动收到通知并更新。 核心概念 观察者模式包含以下核心角色&#xff1a; ‌Subje…