C#中ref和out的使用小结

【ISAR成像】基于Matlab的飞机点目标模型仿真与图像优化 本文详细介绍了如何使用Matlab进行ISAR成像仿真,重点讲解了从构建飞机点目标模型到生成清晰图像的完整流程。通过模拟雷达回波、距离压缩、运动补偿及方位压缩等核心信号处理步骤,并结合相位梯度自聚焦等优化技巧,有效提升了ISAR图像的清晰度与分辨率。文章还分享了雷达参数调优、加窗处理等实战经验,为雷达信号处理与目标识别研究提供了实用指导。 阅读详情

 

ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。

- 使用ref前必须对变量赋值,out不用。

- out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。

 

区别可以参看下面的代码:

  1. using System;
  2. class TestApp
  3. {
  4.  static void outTest(out int x, out int y)
  5.  {//离开这个函数前,必须对x和y赋值,否则会报错。 
  6.   //y = x; 
  7.   //上面这行会报错,因为使用了out后,x和y都清空了,需要重新赋值,即使调用函数前赋过值也不行 
  8.   x = 1;
  9.   y = 2;
  10.  }
  11.  static void refTest(ref int x, ref int y)
  12.  { 
  13.   x = 1;
  14.   y = x;
  15.  }
  16.  public static void Main()
  17.  {
  18.   //out test
  19.   int a,b;
  20.   //out使用前,变量可以不赋值
  21.   outTest(out a, out b);
  22.   Console.WriteLine("a={0};b={1}",a,b);
  23.   int c=11,d=22;
  24.   outTest(out c, out d);
  25.   Console.WriteLine("c={0};d={1}",c,d);
  26.   //ref test
  27.   int m,n;
  28.   //refTest(ref m, ref n); 
  29.   //上面这行会出错,ref使用前,变量必须赋值
  30.   int o=11,p=22;
  31.   refTest(ref o, ref p);
  32.   Console.WriteLine("o={0};p={1}",o,p);
  33.  }
  34. } 

详解:

ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量。它们的区别是:

1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。

2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。

3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

注:在C#中,方法的参数传递有四种类型:传值(by value),传址(by reference),输出参数(by output),数组参数(by array)。传值参数无需额外的修饰符,传址参数需要修饰符ref,输出参数需要修饰符out,数组参数需要修饰符params。传值参数在方法调用过程中如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保留原来传入时的值。传址参数恰恰相反,如果方法调用过程改变了参数的值,那么传入方法的参数在调用完成以后也随之改变。实际上从名称上我们可以清楚地看出两者的含义--传值参数传递的是调用参数的一份拷贝,而传址参数传递的是调用参数的内存地址,该参数在方法内外指向的是同一个存储位置。

方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。

若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。

传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。

属性不是变量,不能作为 ref 参数传递。

如果两种方法的声明仅在它们对 ref 的使用方面不同,则将出现重载。但是,无法定义仅在 ref 和 out 方面不同的重载。

out

方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。

当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。

若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。

不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。

属性不是变量,不能作为 out 参数传递。


网上有很多文章说ref 只传值,out传地址等等这种说法,好像不是非常的准确。以下是我做的实例代码,大家可以去试试:

  1. using System;
  2. using System.Windows.Forms;
  3. public class Test
  4. {
  5.     public static void Main()
  6.     {
  7.         cmdOut_Click();
  8.     }
  9.     public static int RefValue(int i, ref int j)
  10.     {
  11.         int k = j;
  12.         j = 222;
  13.         return i + k;
  14.     }
  15.     public static int OutValue(int i, out int j)
  16.     {
  17.         j = 222;
  18.         return i + j;
  19.     }
  20.     private static void cmdRef_Click()
  21.     {
  22.         int m = 0;
  23.         MessageBox.Show(RefValue(1, ref m).ToString());
  24.         MessageBox.Show(m.ToString());
  25.     }
  26.     private static void cmdOut_Click()
  27.     {
  28.         int m;
  29.         MessageBox.Show(OutValue(1, out m).ToString());
  30.         MessageBox.Show(m.ToString());
  31.     }
  32. }
C语言程序设计——单词的统计和替换 【任务描述】 对任意一篇英文文章,统计其中每个单词分别出现了多少次,并可替换指定的单词。⑶ 对单词进行替换时,允许用户选择全部替换或逐个替换。替换完成后,将文章保存到文件。⑴ 英文文章以文件形式输入。⑵ 统计的结果保存到文件。 阅读详情

相关推荐

大华/华睿工业相机(摄像头)链接电脑,并用OpenCV打开

睿科是大华旗下机器视觉子公司,现在工业相机一般是华睿在产,要下载驱动程序,要到华睿官网哪里下载。由于我的电脑没有摄像头,所以摄像头序列化为0,电脑的第一个摄像头默认为0,序列号是0,1,2,3……,你是什么接口连接的就选择什么, 建议直接全选。我这里选择第二个,下载后点击安装,的你要点击识别右侧设置,设置。这个过程很简单,故不赘述。打开你的设备会在右边显示。

qq_48050838的博客 1万+

C#基础:ref和out的区别

ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量。它们的区别是: 1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。 2、使用ref和out时,在方法...

weixin_30667301的博客 436

Halcon相机标定实战:从参数设置到精度优化全解析

本文详细解析Halcon相机标定的全流程,从基础概念到实战技巧,涵盖参数设置、精度优化及常见问题解决方案。通过实际案例和代码示例,帮助读者掌握工业视觉项目中相机标定的关键技术,提升测量精度和系统稳定性。

weixin_29279153的博客 322

C#中ref、out、in的区别与使用

C#中ref、out、in的区别与使用

橙-极纪元-JJYCheng 3495

【Gazebo安装指南】Ubuntu22.04LTS环境下的高效配置与常见问题解决

本文提供了在Ubuntu 22.04 LTS系统上高效安装和配置Gazebo仿真环境的详细指南。针对Gazebo Classic版本,文章对比了通过ROS 2仓库和Ubuntu官方仓库两种主流安装方法,并重点解决了安装过程中常见的软件包定位、模型下载及图形驱动等问题,帮助用户快速搭建稳定的机器人仿真开发环境。

weixin_29279101的博客 436

【数据分享】2012-2022年全国及各城市POI(兴趣点)数据(超20G)

POI(一般作为Point of Interest的缩写,也有Point of Information的说法),通常称作兴趣点,泛指互联网电子地图中的点类数据,基本包含名称、地址、坐标、类别四个属性;随着互联网电子地图服务与LBS应用的普及,POI无论从概念范畴,还是从信息纵深都有了长足发展,互联网各个风口或火山口都和POI有一定关系,如O2O、电商、社交、互联网金融、共享经济等。

J_Giser的博客 2737

c# 方法参数修饰符(out、ref、in)的区别

作用:通过ref修饰符传递的参数必须在方法调用之前初始化,并且方法内对参数的修改会对调用方的变量产生影响。作用:通过out修饰符传递的参数可以在方法内部进行赋值,而不需要在方法调用之前初始化。在C#中,ref、out和in是三种方法参数修饰符,它们在传递参数的方式和作用上有所不同。传递方式:使用ref修饰符的参数可以是输入输出参数,即在方法调用前后都可以对其进行修改。传递方式:使用in修饰符的参数只能作为输入参数,即在方法内部不能对其进行修改。ref修饰符用于输入输出参数,方法内部可以对其进行修改。

qq_41942413的博客 2526

解析AI人工智能领域AI芯片的散热技术

当你用ChatGPT写代码、用AI生成高清图片时,背后的AI芯片可能正在“发高烧”——全球TOP500超算的平均功耗已突破10兆瓦,单颗GPU的峰值功耗超过700W(相当于3台家用空调同时运行)。本文将聚焦AI芯片的散热技术,覆盖从基础原理到前沿方案的全链条解析,帮助读者理解“散热为什么比算力更重要”。

AIGC应用创新大全的博客 936

C#中 关键字 in、out、ref的区别与使用

in out ref

_乐无的博客 2556

【LSTM回归预测】attention机制LSTM时间序列回归预测【含Matlab源码 1992期】

attention机制LSTM时间序列回归预测 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2591

KEPServerEX 6 之 EX 6.11.718.0 发布说明

KEPServerEX 6.11.718.0 发布说明

-雲飛兄-博客 2882

C#关键字in out ref的作用与区别

C#关键字 in out ref in 函数传参被in关键字修饰后,在函数内部作为只读,不能再被赋值 out 函数传参被out关键字修饰后,在函数内部使用前必须先赋值,可以使用在函数返回值不为一个或返回值有多个但类型不同的情况下 ref ref在使用上比out的限制小一些,主要区别有 1、ref传进去的参数必须在调用前初始化,out不必 2、ref传进去的参数在函数内部可以直接使用,而out不可(除非在函数体内部,out参数在使用之前赋值) 3、ref传进去的参数在函数内部可以不被修改,但out必须在离开函

haotian10000的博客 382

VMware Horizon 8 2111 部署系列(九)创建即时克隆桌面池

即时克隆桌面池是在 vCenter Server 中使用 vmFork 技术(称为即时克隆 API)从最佳配置映像创建的自动桌面池。即时克隆共享同一个基础映像虚拟机,使用基础映像虚拟机的快照创建的,它使用的存储空间也少于完整虚拟机。 即时克隆始终保持开机状态,并在注销后从当前发布的映像重新创建。...

白昼的技术专栏 4043

c#中out和ref使用小结

1、out必须在函数体内初始化,在外面初始化没意义。也就是说,out型的参数在函数体内不能得到外面传进来的初始值。2、ref必段在函数体外初始化。3、两都在函数体的任何修改都将影响到外面ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。使用ref前必须对变量赋值,out不用。  out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要...

alalei6000的博客 177

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C#中ref与out使用小结

使用ref前需要将变量初始化,而使用out前初始化与否都可以,ref传递的是参数的地址,out则是参数的返回值,ref传递的参数在函数退出时,赋值与否,编译器都不会报错;而out传递的参数则需要在退出函数时完成赋值操作。 示例如下: using System; using System.Collections.Generic; using System.Linq; usin...

weixin_30763455的博客 92

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C# ref和out传参小结

class Program { static void REF(ref int i) { i++; Console.WriteLine("ref--{0}",i); } static void OUT(out int i) { i

.net已寻山前道,旁路Java重头越 784
上一篇: 使用 AsyncCallback 委托结束异步操作
下一篇: C#多线程编程实例实战教程
浩西
博客等级 码龄19年 47粉丝 48原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值