C#中Ref和Out
2021/10/7 20:41:31
本文主要是介绍C#中Ref和Out,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
问题:现在需要通过一个方法交换a,b两个变量的值,应该如何做?
我是如下做法:
int a = 1; int b = 2; public void ChangeNumber(int a, int b) { int t = a; a = b; b = t; Debug.LogFormat("方法内a=>{0}", a); Debug.LogFormat("方法内b=>{0}", b); } private void Start() { ChangeNumber(a, b); Debug.LogFormat("方法外a=>{0}", a); Debug.LogFormat("方法外b=>{0}", b); }
发现并不能交换a和b的值;解析如下:int 为值类型它存储在线程的栈中调用ChangeNumber时候相当于拷贝了一份a和b的值。在ChangeNumber方法中交换值仅仅是在改变拷贝的值,和原来的ab没有任何关系。原来的a还是原来的a b还是原来的b.这就是C#中按值传递的原理。传递的是变量对应数据的一个拷贝,而不是本身。
所以这个时候C#就为我们提供了这样的解决方案:ref和out可以让值类型按引用进行传递
public void ChangeNumber(ref int a,ref int b) { int t = a; a = b; b = t; Debug.LogFormat("方法内a=>{0}", a); Debug.LogFormat("方法内b=>{0}", b); } private void Start() { ChangeNumber(a, b); ChangeNumber(a, ref b); Debug.LogFormat("方法外a=>{0}", a); Debug.LogFormat("方法外b=>{0}", b); }
问题:现在需要一个方法,通过计算返回平均值和和?按照传统的普通方法只能有一个返回值,而Out让它成为了可能。当然了Ref也可以做到。区别后面另说。
public void GetResult(out int num,out int ave) { num = a + b; ave = num / 2; } private void Start() { //尽管作为 out 参数传递的变量不必在传递之前进行初始化,但需要在调用方法前先声明。 GetResult(out int num, out int ave); Debug.LogError("num==>" + num); Debug.LogError("ave==>" + ave); }
总结:ref在使用前必须进行初始化,out 参数传递的变量不必在传递之前进行初始化,但是需要在调用方法前声明。Ref又进又出,Out出不进。那么在什么情况下使用Ref和Out呢?重点重点重点:
ref可以把参数的值传入函数,但无法通过out把一个数值传入方法中。体会理解这句话非常重要。当我们对于传进来的值有依赖的时候应该使用ref。而无法通过通过Out把一个参数传入方法中,也就是Out所在的方法对于传进来的值没有依赖性。
Ps:编辑器不允许通过Ref和Out进行重载,说明Ref和Out仅仅是在编辑器角度做了区分,生成的IL代码是一致的。
这篇关于C#中Ref和Out的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#