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

2024-04-15 16:44

本文主要是介绍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();

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

这篇关于C#值传递和引用传递,ref和out关键字,装箱和拆箱的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/906362

相关文章

C#中的Drawing 类案例详解

《C#中的Drawing类案例详解》文章解析WPF与WinForms的Drawing类差异,涵盖命名空间、继承链、常用类及应用场景,通过案例展示如何创建带阴影圆角矩形按钮,强调WPF的轻量、可动画特... 目录一、Drawing 是什么?二、典型用法三、案例:画一个“带阴影的圆角矩形按钮”四、WinForm

Java中的volatile关键字多方面解析

《Java中的volatile关键字多方面解析》volatile用于保证多线程变量可见性与禁止重排序,适用于状态标志、单例模式等场景,但不保证原子性,相较synchronized更轻量,但需谨慎使用以... 目录1. volatile的作用1.1 保证可见性1.2 禁止指令重排序2. volatile的使用

C#之枚举类型与随机数详解

《C#之枚举类型与随机数详解》文章讲解了枚举类型的定义与使用方法,包括在main外部声明枚举,用于表示游戏状态和周几状态,枚举值默认从0开始递增,也可手动设置初始值以生成随机数... 目录枚举类型1.定义枚举类型(main外)2.使用生成随机数总结枚举类型1.定义枚举类型(main外)enum 类型名字

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速