C# 经典:ref 和 out 的区别详解

在C#中,ref和out关键字用于按引用传递变量,它们在变量传递、输出参数、返回值以及异常处理等方面有一些重要区别。本文将详细阐述这些差异。

1. 变量传递

ref和out关键字都可以用于方法的参数传递。它们的主要区别在于如何处理变量的引用。

  • ref关键字在方法调用时创建了一个引用,该引用指向调用方法时传递的变量。在方法内部,可以通过引用修改变量的值,并且这些更改将反映在原始变量上。
void ModifyValue(ref int a)
{a = 5;
}
class Program
{static void Main(string[] args){int b = 1;ModifyValue(ref b);Console.WriteLine(b); // 输出:5}
}
  • out关键字也在方法调用时创建了一个引用,但是与ref不同,out参数在方法内部不需要初始化。然而,out参数必须在方法返回之前被赋值。
void SetValue(out int a)
{a = 5;
}class Program
{static void Main(string[] args){int b;SetValue(out b);Console.WriteLine(b); // 输出:5}
}

2. 输出参数

ref和out关键字都可以用作输出参数,但是它们在输出参数的使用上有一些差异。

  • ref输出参数通常用于需要修改输入参数的情况。在方法内部,可以通过引用直接修改输入参数的值。
ref int AddAndReturn(int a, int b)
{return a + b;
}
class Program
{static void Main(string[] args){int c = AddAndReturn(1, 2);Console.WriteLine(c); // 输出:3}
}
  • out输出参数通常用于方法需要计算多个输出值的情况。在方法内部,可以通过out参数返回一个或多个值。
out int MultiplyAndReturn(int a, int b)
{return a * b;
}
class Program
{static void Main(string[] args){int c, d;MultiplyAndReturn(1, 2, out c, out d);Console.WriteLine(c); // 输出:2Console.WriteLine(d); // 输出:2}
}

3. 返回值

ref和out关键字都可以用于方法的返回值,但是它们在返回值的使用上有一些差异。

  • ref返回值通常用于需要返回多个值的方法。在方法内部,可以通过引用返回一个或多个值。
ref int GetValues()
{int a = 1;int b = 2;return ref a;
}
class Program
{static void Main(string[] args){int c = GetValues();Console.WriteLine(c); // 输出:1}
}
  • out返回值通常用于需要返回单个值的方法。在方法内部,可以通过out参数返回一个值。
out int GetValue()
{int a = 1;return a;
}
class Program
{static void Main(string[] args){int c = GetValue();Console.WriteLine(c); // 输出:1}
}

4. 异常处理

ref和out关键字在异常处理方面也有一些差异。

  • ref参数在方法内部发生异常时,异常会被抛出,并且原始变量的值不会被修改。
void ModifyValue(ref int a)
{try{// 模拟发生异常throw new Exception("An error occurred");}catch (Exception){a = 0;throw;}
}
class Program
{static void Main(string[] args){try{int b = 1;ModifyValue(ref b);}catch (Exception){Console.WriteLine("Exception occurred.");}}
}
  • out参数在方法内部发生异常时,异常会被抛出,但是out参数的值不会被设置。
void SetValue(out int a)
{try{// 模拟发生异常throw new Exception("An error occurred");}catch (Exception){a = 0;throw;}
}
class Program
{static void Main(string[] args){try{int b;SetValue(out b);}catch (Exception){Console.WriteLine("Exception occurred.");}}
}

总结:

ref和out在C#中都是用于按引用传递变量的关键字。它们在变量传递、输出参数、返回值以及异常处理等方面有一些重要区别。ref关键字在方法调用时创建了一个引用,该引用指向调用方法时传递的变量。在方法内部,可以通过引用修改变量的值,并且这些更改将反映在原始变量上。out关键字也在方法调用时创建了一个引用,但是与ref不同,out参数在方法内部不需要初始化。然而,out参数必须在方法返回之前被赋值。在输出参数和返回值方面,ref和out都可以用于返回多个值或单个值。然而,它们在方法内部发生异常时的处理方式有所不同。ref参数在异常发生时,原始变量的值不会被修改,而out参数的值不会被设置。

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

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

相关文章

wordpress模板购买网站推荐

简站wordpress主题 老牌wordpress开发团队,开发过数百款wordpress主题,作品是最好的简历,靠作品说话,看作品喜欢不喜欢就可以了。 https://www.jianzhanpress.com WP模板牛 免费wordpress下载网站,上面有上百款免费…

大学课本电子版下载

原文:https://www.zhihu.com/question/356005353

一款.NET下 WPF UI框架介绍

WPF开源的UI框架有很多,如HandyControl、MahApps.Metro、Xceed Extended WPF Toolkit™、Modern UI for WPF (MUI)、Layui-WPF、MaterialDesignInXamlToolkit、等等,今天小编带大家认识一款比较常用的kaiyuanUI---WPF UI,这款ui框架美观现代化,用起来也超级方便, 界面展示…

No matching version found for get-symbol-description@^1.0.2前端项目报错解决(亲测可用)

目录 一、问题详情 二、解决方案 一、问题详情 拉取一个新的项目的时候,前端进行install依赖的时候,报了如下的错误。 6120 verbose node v16.15.1 6121 verbose npm v8.11.0 6122 error code ETARGET 6123 error notarget No matching version foun…

UE5渲染视频教程推荐

学习视频 虚幻引擎5!如何导出为 MP4 和 MOV 视频文件!_哔哩哔哩_bilibili UE4小教程:如何录制游戏过程动画并渲染_哔哩哔哩_bilibili 要点 1.record type要设置 2.ffmpeg下载安装配置

2024年1月京东洗衣机行业数据分析:TOP10品牌销量销额排行榜

鲸参谋监测的京东平台1月份洗衣机市场销售数据已出炉! 根据鲸参谋电商数据分析平台显示,今年1月份,京东平台上洗衣机的销量约160万件,环比上个月增长约42%,同比去年下滑7%;销售额约28亿元,环比…

Vue-2

生命周期 Vue 生命周期 Vue 生命周期函数 Vue 生命周期过程中&#xff0c;会自动运行一些函数&#xff0c;被称为"生命周期钩子"&#xff0c;让开发者可以在特定阶段运行自己的代码 created 应用演示 <body><div class"box"><ul v-for&q…

Java设计模式——模板方法模式

当你在设计一个业务功能时&#xff0c;有一些方法/算法的结构是固定的&#xff0c;但其中的某些步骤可能会因不同的情境而发生不同的变化。你希望固定核心结构部分&#xff0c;然后灵活的去定制一些特定的步骤。这个时候可以考虑使用模板方法&#xff0c;通过定义一个抽象的父类…

景联文科技:引领战场数据标注服务,赋能态势感知升级

自21世纪初&#xff0c;信息化战争使战场环境变得更为复杂和难以预测&#xff0c;持续涌入的海量、多样化、多来源和高维度数据&#xff0c;加大了指挥员的认知负担&#xff0c;使其需要具备更强的数据处理能力。 同时&#xff0c;计算机技术和人工智能技术的飞速发展&#xff…

【算法训练营】:周测5

需要详细的实现代码实现请私信博主 考题10-5 题目描述 平面固定有一些全等的圆角矩形&#xff0c;不同的圆角矩形具有不同的位置和倾斜角。这些圆角矩形都通过将以原本四个直角处距离两条直角边均为 r&#xfffd; 的位置为圆心&#xff0c;半径为 r&#xfffd; 且与两条直…

JAVA线程 启动线程 理解中断

启动线程 线程对象在初始化完成之后&#xff0c;调用start()方法就可以启动这个线程。线程start()方法的含义是&#xff1a;当前线程&#xff08;即parent线程&#xff09;同步告知Java虚拟机&#xff0c;只要线程规划器空闲&#xff0c;应立即启动调用start()方法的线程。 注…

CCF-CSP: 因子化简(100分)

第一次提交的时候90分&#xff0c;显示的超时&#xff0c;第一反应是难道有死循环? 检查一遍发现并没有&#xff0c;那就是真的超时了&#xff0c;然后翻阅blog,发现不需要去做判断是否是素数这一步&#xff0c;原因是任意一个非素数都是素数乘积构成&#xff0c;比如说&#…

dpdk协议栈之udp架构优化

dpdk优势 传统网络架构与 DPDK&#xff08;Data Plane Development Kit&#xff09;网络架构之间存在许多区别&#xff0c;而 DPDK 的优势主要体现在以下几个方面&#xff1a; 数据包处理性能&#xff1a;传统网络架构中&#xff0c;网络数据包的处理通常由操作系统的网络协议…

理想滤波器、巴特沃斯滤波器、高斯滤波器实现(包含低通与高通,代码实现与分析)

本篇博客聚焦理想滤波器、巴特沃斯滤波器、高斯滤波器进行原理剖析、代码实现和结果总结&#xff0c;代码含有详细注释&#xff0c;希望帮助大家理解。 以下将从理想低通滤波器、理想高通滤波器、巴特沃斯低通滤波器、巴特沃斯高通滤波器、高斯低通滤波器、高斯高通滤波器六个…

Linux按键输入实验-按键的字符设备驱动代码框架

一. 简介 前面一篇文章学习了:在设备树文件中创建按键的设备节点。文章地址如下: Linux按键输入实验-创建按键的设备节点-CSDN博客 本文继续进行 Linux按键输入实验。本文主要编写字符设备(按键输入也是 gpio功能)驱动代码框架。 二. Linux按键输入实验-按键的字符设备…

【GPTs分享】每日GPTs分享之Image Generator Tool

今日GPTs分享&#xff1a;Image Generator Tool。Image Generator Tool是一种基于人工智能的创意辅助工具&#xff0c;专门设计用于根据文字描述生成图像。这款工具结合了专业性与友好性&#xff0c;鼓励用户发挥创造力&#xff0c;同时提供高效且富有成效的交互体验。 主要功能…

Debezium发布历史153

原文地址&#xff1a; https://debezium.io/blog/2023/07/10/custom-http-signaling-notification/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Debezium signaling and notifications - Part 2: Customisat…

<网络安全>《55 概念讲解<第二课 MAC地址>》

1 MAC地址是什么&#xff1f; MAC地址&#xff08;Media Access Control Address&#xff09;是一种标识网络设备的唯一地址&#xff0c;也被称为物理地址或硬件地址。它由网络设备制造商在生产过程中写入网卡的EPROM&#xff08;一种可擦写的闪存芯片&#xff09;。 IP地址和…

分布式锁选型+缓存db一致性

基于Redis Cluster模式 setnx就可以实现加锁&#xff0c;del实现解锁&#xff0c;但是这样不具备原子性&#xff0c;存在无法释放的可能。 因此可以使用在加锁时增加过期时间命令&#xff0c;做到原子性的加锁并且可以自动释放。 一些问题&#xff1a; key的过期时间不能设…

LabVIEW变压器振动信号数据采集与分析

LabVIEW变压器振动信号数据采集与分析 随着电力系统的快速发展&#xff0c;对变压器的安全监控和故障诊断需求日益增加。设计了一套基于LabVIEW的变压器振动信号数据采集与分析系统&#xff0c;提高变压器的运行安全性和可靠性&#xff0c;实现对变压器振动信号的实时监测和故…