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.hqwc.cn/news/620367.html

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

相关文章

Python-GEE遥感云大数据分析、管理与可视化及多领域案例实践应用

随着航空、航天、近地空间遥感平台的持续发展,遥感技术近年来取得显著进步。遥感数据的空间、时间、光谱分辨率及数据量均大幅提升,呈现出大数据特征。这为相关研究带来了新机遇,但同时也带来巨大挑战。传统的工作站和服务器已无法满足大区域…

Docker Desktop修改镜像存储路径 Docker Desktop Start ... 卡死

1、CMD执行wsl -l -v --all 2、Clean / Purge data 3、导出wsl子系统镜像: wsl --export docker-desktop D:\docker\wsl\distro\docker-desktop.tar wsl --export docker-desktop-data D:\docker\wsl\data\docker-desktop-data.tar4、删除现有的wsl子系统: wsl -…

江新安教授受邀金佰利进行《研发创新与创新思维》培训

近日,科济管线创始人江新安教授受邀金佰利为金佰利全国研发团队进行《研发创新与创新思维》培训授课。创新思维的两种思维形式——非逻辑思维和逻辑思维及其训练的主要方法。创新思维的培养,对于克服思维定势,提供创新方法,可以发…

阿斯达年代记三强争霸开服时间+官网地址+预约下载安装教程分享

阿斯达年代记国际服,游戏分为三个势力,分别是阿斯达、亚高和不罚者,每个玩家都必须选择一个势力,而每个势力每周将会诞生一名势力族长,将会从五名候选人中投票产生,想要进入候选人名单,必须每天…

突破编程_前端_SVG(ellipse 椭圆形)

1 ellipse 元素的基本属性和用法 ellipse 元素用于创建椭圆形状。它具有一系列的基本属性,允许自定义椭圆的外观和位置。以下是一些 ellipse 元素的基本属性和用法: (1)基本属性 cx 和 cy:这两个属性定义了椭圆中心…

HCIP-Datacom H12-831 题库补充(4/12)

2024年 HCIP-Datacom(H12-831)最新题库,完整题库请扫描上方二维码,持续更新。 以下关于OSPF Sham Link的描述,错误的是哪一项? A:为了使VPN流量通过MPLS VPN骨干网转发,Sham Link的路…

华火电焰灶全国经销商加盟_优势怎么样_费用多少_华焰天下

随着科技的不断进步,电焰灶作为现代厨房的重要设备,其市场需求持续增长。华火电焰灶,凭借其独特的技术优势和广泛的市场前景,吸引了众多投资者的目光。本文将从华火电焰灶的优势、加盟费用以及华焰天下的机遇三个方面,…

光遇steam下载方法 steam光遇pc下载教程 两种方法告别锁区

光遇steam下载方法 steam光遇pc下载教程 两种方法告别锁区 由《风之旅人》创作者倾力打造的治愈系MMO游戏Sky光遇,不但在全球范围内赢得了许多的奖项,而且赢得了许多玩家的喜爱。在这款游戏中,有着七个美丽而神秘的光之领域等待着玩家们的探…

220V转3.3V线性降压芯片WT5100

220V转3.3V线性降压芯片WT5100 WT5100就是那个离线式的稳压器芯片,没有电感的那种。里面内置了650V的大功率MOSFET,启动控制电路,电压控制电路,交流信号检测电路等等。通过切换SEL管脚,它就能输出5V或3.3V的电压。不需…

Java多线程学习总结

在Java中,多线程编程是一种重要的编程模型,它允许程序同时执行多个任务,从而提高了程序的执行效率和响应速度。 一、基本概念 进程与线程:进程是系统分配资源的基本单位,它包含了程序执行所需的资源,如代码…

目标检测应用场景—数据集【NO.30】织物缺陷图像目标检测数据集

写在前面:数据集对应应用场景,不同的应用场景有不同的检测难点以及对应改进方法,本系列整理汇总领域内的数据集,方便大家下载数据集,若无法下载可关注后私信领取。关注免费领取整理好的数据集资料!今天分享…

GDPU Java 天码行空7

实验目的: 熟悉awt组件和三种基本布局,掌握按钮、文本框、标签、等基本控件的使用和事件响应编程。 熟悉布局管理器 1. 窗体关闭事件 💖 WindowCloseEvent.java import java.awt.event.WindowAdapter; // 导入WindowAdapter类,…