当前位置: 首页 > news >正文

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参数的值不会被设置。

相关文章:

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

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

Linux 系统添加虚拟内存的方法

https://cloud.189.cn/t/6nqy2m3YnUN3 (访问码:ic3i) 云服务器 群晖NAS 切换到 root 模式 sudo su 或者 sudo -i #群晖/volume2 是你添加的硬盘挂载路径 不一定是 volume2 有可能是 volume1 #如果你只有1快硬盘 volume2 改成 volume1 …...

PHP 函数四

一 fgets(resource $stream, ?int $length null) 从文件指针中读取一行。 返回字符串,如果文件指针中没有更多的数据了则返回 false。错误发生时返回 false。 $stream 为文件资源,必须指向fopen()或fscokopen()成功打开的文件。文件打开之后&#x…...

【Android】反编译APK及重新打包

1.下载 APK 反编译工具 首先,需要下载一个 APK 反编译工具,例如 Apktool。可以在官网(https://apktool.org/docs/install)上下载最新版本的 Apktool,也可以使用包管理器来安装。 2.反编译 APK 文件 将要修改包名的 …...

下载huggingface数据集到本地并读取.arrow文件遇到的问题

文章目录 1. 524MB中文维基百科语料(需要下载的数据集)2. 下载 hugging face 网站上的数据集3. 读取 .arrow 文件报错代码4. 纠正后代码 1. 524MB中文维基百科语料(需要下载的数据集) 2. 下载 hugging face 网站上的数据集 要将H…...

.NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】

设计模式是软件工程中常用的解决特定问题的通用设计方法。它们提供了经过验证的解决方案,可用于解决在软件开发过程中经常遇到的一些常见问题。设计模式不是一种具体的编程语言特性或语法,而是一种通用的设计思想或模板,可以帮助开发人员设计…...

【Web】关于jQuery萌新必须要知道的那些基础知识

目录 DOM对象和jQuery包装集对象 jQuery选择器 jQuery操作元素的属性,样式,内容 jQuery创建元素和添加元素,删除元素和遍历元素 jQuery-ready加载事件 jQuery绑定事件 jQuery中ajax的使用 DOM对象和jQuery包装集对象 DOM对象&#xf…...

第 1 章 微信小程序与云开发从入门到实践从零开始做小程序——开发认识微信小程序

小北的参考工具书 小程序开发的图书并不少,这本书仍然值得你拥有! 首先,这是一本全栈小程序开发教程,循序渐进,由浅入深,介绍了小程序开发你想了解的方方面面,包括近其小程序开发的各种新技术应…...

数据隐私安全趋势

在当今社交媒体和开源开发的世界中,共享似乎已成为社会常态。毕竟,我们都被教导分享就是关怀。这不仅适用于个人,也适用于公司:无论是有意在社交媒体帐户和公司网站上,还是无意中通过员工的行为,公司可能会…...

学习磁盘管理

文章目录 一、磁盘接口类型二、磁盘设备的命名三、fdisk分区四、自动挂载五、扩容swap六、GPT分区七、逻辑卷管理八、磁盘配额九、RAID十、软硬链接 一、磁盘接口类型 IDE、SATA、SCSI、SAS、FC(光纤通道) IDE, 该接口是并口。SATA, 该接口是串口。SCS…...

C语言从入门到精通(一) - C语言开发神器CLion

clion安装配置 下载安装 下载 安装 运行clion clion设置 配置快捷键 配置快捷键为eclipse模式 [可以选择自己喜欢的快捷键模式] 添加cygwin编译器 下载cygwin Cygwin Installation Cygwin是一个在windows平台上运行的类UNIX模拟环境,是Cygnus Solutions公司开发的…...

【办公类-16-10-02】“2023下学期 6个中班 自主游戏观察记录(python 排班表系列)

背景需求: 已经制作了本学期的中4班自主游戏观察记录表 【办公类-16-10-01】“2023下学期 中4班 自主游戏观察记录(python 排班表系列)-CSDN博客文章浏览阅读398次,点赞10次,收藏3次。【办公类-16-10-01】“2023下学…...

SpringBooot之RestTemplate接口返回多层泛型导致java.util.LinkedHashMap cannot be cast to异常

统一泛型返回对象 Data public class Res<T> implements Serializable {private static final long serialVersionUID 6558796578827818466L;private Integer code; //状态码private String msg; //返回消息private T data; //数据 }data里包裹的泛型对象假设是DZPJ D…...

【新三板年报文本分析】第二辑:从pdf链接的列表中批量下载年报文件

第一辑中已经获取了新三板年报的pdf链接&#xff0c;使用request库进行批量下载。 send_headers为requests的headers&#xff0c;不需要做变动。 在for循环中读取每一行数据的链接数据&#xff0c;创建一个空pdf&#xff0c;将链接指向的pdf文件写入空pdf文件。 for循环内容…...

Jessibuca 插件播放直播流视频

jessibuca官网&#xff1a;http://jessibuca.monibuca.com/player.html git地址&#xff1a;https://gitee.com/huangz2350_admin/jessibuca#https://gitee.com/link?targethttp%3A%2F%2Fjessibuca.monibuca.com%2F 项目需要的文件 1.播放组件 <template ><div i…...

【Docker】03 容器操作

文章目录 一、流转图二、基本操作2.1 查看本地容器进程2.2 启动容器2.2.1 交互式启动容器2.2.2 后台启动容器 2.3 进入容器2.4 停止启动重启容器2.5 退出容器2.6 删除容器2.7 提交容器&#xff08;打包成镜像&#xff09;2.8 拷贝文件2.8.1 拷贝容器内文件到宿主机2.8.2 拷贝宿…...

【HarmonyOS】鸿蒙开发之Stage模型-基本概念——第4.1章

Stage模型-基本概念 名词解释 AbilityStage:应用组件的“舞台“ UIAbility:包含UI界面的应用组件&#xff0c;是系统调度的基本单元 WindowStage:组件内窗口的“舞台“ Window&#xff1a;用来绘制UI页面的窗口 HAP:Harmony Ability Package(鸿蒙能力类型的包) HSP:Harmony Sh…...

什么是芯片委外管理系统? 及其主要作用

随着半导体产业的飞速发展&#xff0c;芯片制造企业面临着日益复杂的生产和管理挑战。为了应对这些挑战&#xff0c;许多企业选择将部分生产环节委托给外部厂商进行&#xff0c;这种合作模式被称为“委外加工”。而为了有效地管理和协调这一合作模式&#xff0c;便诞生了“芯片…...

【实战-08】 flink自定义Map中的变量的行为

场景 自定义Map或者别的算子的时候&#xff0c;有时候需要定义一些类变量&#xff0c;在flink内部高并发的情况下需要正确理解这些变量的行为 代码 package com.pg.function;import org.apache.flink.api.common.functions.MapFunction; import org.apache.flink.api.common…...

Docker Volume

"Ice in my vein" Docker Volume(存储卷) 什么是存储卷? 存储卷就是: “将宿主机的本地文件系统中存在的某个目录&#xff0c;与容器内部的文件系统上的某一目录建立绑定关系”。 存储卷与容器本身的联合文件系统&#xff1f; 在宿主机上的这个与容器形成绑定关系…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...