C#值传递和引用传递,ref和out关键字,装箱和拆箱

C#值传递和引用传递

1.值传递和引用传递

值传递:值传递时,系统首先为被调用方法的形参分配内存空间,并将实参的值按位置一一对应复制给形参,被调用方法中形参得任何改变都不会影响到相应的实参。
引用传递时:系统不是将实参本身得值赋值后传给形参,而是将其引用值(地址值)传递给形参。因此形参所引用得该地址上的变量与传递的实参相同,方法体内相应的形参值得任何改变都会影响到作为引用传递的实参。

Console.WriteLine("#####################下面是值传递和引用传递的测试代码#####################");Console.WriteLine();//值传递int Age1 = 18;Console.WriteLine($"值参数传递前Age1的值:{Age1}");//调用方法AgeAdd(Age1);Console.WriteLine($"值参数传递后Age1的值:{Age1}");Console.WriteLine();//引用传递Student stu = new Student();stu.Age = 28;Console.WriteLine($"引用参数传递前Age1的值:{stu.Age}");//调用方法AgeAdd(stu);Console.WriteLine($"引用参数传递前Age1的值:{stu.Age}");Console.ReadKey();//使用的方法public static void AgeAdd(int age){age += 10;Console.WriteLine("值传递方法中参数的值: Age : " + age);}public static void AgeAdd(Student stu){stu.Age += 10;Console.WriteLine("引用传递方法中参数的值: Age : " + stu.Age);}

运行结果:
在这里插入图片描述

2.ref与out实现值类型的引用传递

(1)ref指定的参数在函数调用时必须先初始化(必须在执行方法之前给ref修饰的参数赋值),out不用。
(2)out指定的参数在进入函数时会清空自己,因此必须在函数内部进行初始化操作(必须在方法体内给out修饰的变量赋值)后才能使用;而ref不用。
(3)ref可以将值传到方法内,也可以将值传到方法外
(4)out只能将值传到方法外
(5)string是特殊的引用类型,操作与值类型看齐(需要单独的加上ref和out)

注:1.可以通过ref和out来决定值类型变量是否按照引用传递
2.声明方法时形参需要带ref和out关键字,调用方法时传入的实参也需要带ref和out关键字

            Console.WriteLine("#####下面是ref和out的测试代码#####");//ref——num1必须在方法调用前初始化int num = 5;Console.WriteLine($"执行带ref参数的方法前num的值:{num}");RefDoubleValue(ref num);Console.WriteLine($"执行带ref参数的方法后num的值:{num}");Console.WriteLine($"--------------分割线-----------------");//out——num2无须在方法调用前初始化int num2 = 10;//为了对比所有初始化num2的值Console.WriteLine($"执行带out参数的方法前num的值:{num2}");//调用方法OutDoubleValue(out num2);Console.WriteLine($"执行带out参数的方法后num的值:{num2}");Console.ReadKey();//相关方法 //带ref参数的方法public static void RefDoubleValue(ref int num){num = num * 2;}//带out参数的方法public static void OutDoubleValue(out int num){//方法内部使用前必须初始化num = 9;num = num * 2;}

运行结果:
在这里插入图片描述

3.装箱和拆箱

(1)装箱:把值类型装换成引用类型
(2)拆箱:把引用类型装换成值类型
(3)装箱时是不需要显式的类型转换的,不过拆箱需要显示的类型转换。

装箱具体发生了什么:对象类型在堆中分配一个对象实例,并将值类型的实例复制到新对象中。
第一步:新分配托管堆内存(大小为值类型实例大小加上一个方法表指针)
第二步:将值类型的实例(也就是值,数据)拷贝到新分配的内存中
第三步:返回托管堆中新分配对象的地址(这个地址就是一个指向对象的引用)。

拆箱具体发生了什么:检查对象实例,确保它是给定值类型的一个装箱值;然后再将该值从对象实例复制到值类型变量中。

            Console.WriteLine("#####下面是装箱和拆箱的测试代码#####");//定义一个整型变量int num = 5;//将整型转换为对象类型(隐式)——装箱Object obj = num;Console.WriteLine($"将整型变量num装箱后obj变量的值:{obj}");Console.WriteLine($"--------------分割线-----------------");//将对象类型转换为整型(显式)——拆箱int num2 = (int)obj;Console.WriteLine($"将引用变量obj拆箱后num变量的值:{num2}");Console.ReadKey();

运行结果:
在这里插入图片描述
频繁的装箱拆箱比较浪费系统资源。

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

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

相关文章

【学习笔记十】EWM自动产品包装配置

一、确定包装物料建议的程序 1.定义内向交货处理的凭证类型 2.确定包装物料建议的程序确定原理 使用可以确定包装材料建议的过程来指定业务代码。系统使用这些业务代码查找包装规格。包装期间,系统可建议包装材料。如果系统确定包装规格并建议包装材料,…

Suno AI

Suno is the latest big name in AI, but what is it? Keep reading to learn everything you need to know about Suno AI, including what it is, what it can do, and how much it costs. Suno AI是一款由Anthropic公司开发的人工智能音乐生成器,它利用先进…

Gradle 构建自动化工具入门

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 1. 前言 2. 简介 3. 常见的项目构建工具 4. 安装 4.1. 安装说明 4.2. 下载…

[管理者与领导者-167] :团队管理 - 高效执行力 -6-授权-领导者做个统筹调度的领导者,而不是做冲锋陷阵的士兵

目录 关键词: 前言: 一、管理者做自己该做的事,下属做下属该做的事 二、科学分配任务和职责 三、只有信任员工,才能有效授权 四、授权管头(定目标)管尾(把结果),但…

『大模型笔记』视觉语言模型解释

视觉语言模型解释 文章目录 一. 视觉语言模型解析1.什么是视觉语言模型?2. 开源视觉语言模型概览3. 如何找到合适的视觉语言模型MMMUMMBench 4. 技术细节5.使用变压器 (transformers) 运用视觉语言模型6. 使用 TRL 微调视觉语言模型 二. 参考文章 一. 视觉语言模型…

在Python中如何使用正则表达式? —— 使用Python正则表达式高效处理文本。

在Python中使用正则表达式,你需要导入re模块。re模块提供了一组函数,用于在字符串中搜索匹配特定模式的文本。 下面是一些常用的正则表达式函数: re.search(pattern, string):在字符串中搜索匹配正则表达式pattern的文本&#x…

10.基础乐理-高音点、低音点

首先唱名(do、re、mi、fa、sol、la、si 1234567)先对应在 小字一组上,一般调号 1c 时都是对应在 小字一组上 然后从 小字一组 开始往左或往右,往左的音是越低的,往右的音是越高的,这时也需要给唱名&#xf…

47---PCIE硬件电路设计

视频链接 PCIe硬件电路设计01_哔哩哔哩_bilibili PCIe硬件电路设计 1、PCIE介绍 1.1、PCIe简介 PCI-Express (peripheral component interconnect express)是一种高速串行计算机扩展总线标准,用于在CPU与外围组件之间实现高速串行通信。如今已成为主板扩展总线…

jenkins+git+maven+nodejs安装(linux系统)

前文已经安装完成sonarqube和Sonar Scanner了,接下来可以开始jenkins了 jenkins安装 命令(版本为 2.440) wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo wget https://pkg.jenkins.io/redh…

全方位深入解析CSS background属性

CSS的background属性是我们进行网页布局和设计时不可或缺的一部分,它为元素提供了丰富的背景绘制能力,包括颜色、图像、渐变、重复模式、定位、剪裁等。本文将深入解析background属性的各个组成部分,通过详细的理论讲解与实战代码示例&#x…

【刷题笔记】第四天

文章目录 [2924. 找到冠军 II](https://leetcode.cn/problems/find-champion-ii/description/?envTypedaily-question&envId2024-04-13!!!)题目描述思路分析 [1702. 修改后的最大二进制字符串](https://leetcode.cn/problems/maximum-binary-string-after-change/)题目描述…

学习java第四十四天

Resource 是如何被查找、加载的 Resource 接口是 Spring 资源访问策略的抽象,它本身并不提供任何资源访问实现,具体的资源访问由该接口的实现类完成——每个实现类代表一种资源访问策略。 Spring 为 Resource 接口提供了如下实现类: UrlRes…

vue 开发 滑动页面中出现tabs 并且需要分页的

效果 需求 我们这个页面顶部有tabs 栏 而且可以滑动到底部 进行分页 实现这样的页面我们应该怎么做 你应该会想到scroll-view 这个组件吧 下面我们来详情介绍一下这个页面的实现和功能开发 首先展示一下代码 item 循环项 <template><div class"wechat-or…

dataease部署安装手册

离线安装 1 环境要求 部署服务器要求&#xff1a; 操作系统: Ubuntu 22.04 / CentOS 7 64 位系统CPU/内存: 4核8G磁盘空间: 200G 2 下载离线安装包 请自行下载 DataEase 最新版本的基础安装包&#xff0c;并复制到目标机器的 /tmp 目录下。 安装包下载链接: 开源社区 - FI…

Clustering and Projected Clustering with Adaptive Neighbors 论文阅读

1 Abstract 许多聚类方法基于输入数据的相似性矩阵对数据组进行划分。因此&#xff0c;聚类结果高度依赖于数据相似性学习。由于相似性度量和数据聚类通常是分两步进行的&#xff0c;学习到的数据相似性可能不是数据聚类的最佳选择&#xff0c;从而导致次优结果。在本文中&…

蓝牙耳机哪个品牌的好?五款实力超群品牌分享推荐!

​音乐不仅仅是一种娱乐&#xff0c;它还能激发灵感、放松心情。一款优质的蓝牙耳机能够让音乐体验更加丰富和便捷。在众多的蓝牙耳机中&#xff0c;我特别挑选了几款在音质、设计和功能上都表现出色的产品。无论你是在家中放松、在健身房锻炼&#xff0c;还是在通勤路上&#…

团体程序设计天梯赛 L2-023 图着色问题

L2-023 图着色问题 分数 25 图着色问题是一个著名的NP完全问题。给定无向图G(V,E)&#xff0c;问可否用K种颜色为V中的每一个顶点分配一种颜色&#xff0c;使得不会有两个相邻顶点具有同一种颜色&#xff1f; 但本题并不是要你解决这个着色问题&#xff0c;而是对给定的一种…

鸿蒙 UI预览报错

SyntaxError: Unexpected end of JSON input 删除entry下的.preview文件 重新刷新预览

【主从恢复】利用xtrabackup备份MySQL主库恢复从库

简介 记录一下自己用xtrabackup恢复从库的经过一、备份 1.用到的参数介绍 --backup: 指明为备份 --target-dir: 备份的目录 --defaults-file:指明服务器的配置文件&#xff0c;此参数必须作为innobackupex的第一个参数&#xff0c;否则报错 --login-path: 从登录文件中读取此…

Mybatis-动态标签

动态标签 1.用于处理SQL语句中的空白字符和多余的逗号 -- prefix&#xff1a;指定在SQL语句开头添加的内容。 -- prefixOverrides&#xff1a;指定需要移除的开头部分的内容。 -- suffix&#xff1a;指定在SQL语句结尾添加的内容。 -- suffixOverrides&#xff1a;指定需要移…