C# 方法(ref局部变量和ref返回)
>本章内容:
方法的结构
方法体内部的代码执行
局部变量
局部常量
控制流
方法调用
返回值
返回语句和void方法
局部函数
参数
值参数
引用参数
引用类型作为值参数和引用参数
输出参数
参数数组
参数类型总结
方法重载
命名参数
可选参数
栈帧
递归
ref局部变量和ref返回
在本章前面你己经看到了,你可以使用ref关键字传递一个对象引用给方法调用,这样在调
用上下文中,对对象的任何改动在方法返回后依然可见。ref返回功能则相反,它允许你将一个
引用发送到方法外,然后在调用上下文内使用这个引用。一个相关的功能是ref局部变量,它允
许一个变量是另一个变量的别名。
我们将从ref局部变量这个功能开始讲解。下面是关于ref局部变量功能的重要事项。
- 你可以使用这个功能创建一个变量的别名,即使引用的对象是直类型。
- 对任意一个变量的赋值都会反映到另一个变量上,因为它们引用的是相同的对象,即使
是值类型。
创建别名的语法需要使用关键字ref两次,一次是在别名声明的类型的前面,另一次是在赋
值运算符的右边,“被别名”的变量的前面,如下所示:
下面的代码是一个示例,其中使用ref局部变量功能创建了变量x的一个别名,叫作Y。当×
改变时,y也会变,反之亦然。
class Program
{static void Main(){int x=2;ref int y=ref x;Console.WriteLine($"x={x},y={y}");x=5;Console.WriteLine($"x={x},y={y}");y=6;Console.WriteLine($"x={x},y={y}");}
}
但是,别名功能不是ref局部变量功能最常见的用途。实际上,它经常和ref返回功能一起使
用。ref返回功能提供了一种使方法返回变量引用而不是变量值的方法。这里需要的额外语法也
使用了ref关键字两次:
- 一次是在方法的返回类型声明之前
- 另一次是在return关键字之后,被返回对象的变量名之前
下面的代码演示了一个例子。注意,在方法调用之后,因为调用了修改ref局部变量的代码,
所以类的字段值改变了。
class Simple
{private int Score=5;//ref 返回方法的关键字public ref int RefToValue(){return ref Score;}//ref返回的关键字public void Display(){Console.WriteLine($"Value inside class object:{Score}");}
}class Program
{static void Main(){Simple s=new Simple();s.Display();//ref局部变量的关键字ref int v1Outside=ref s.RefToValue();}v1Outside=10; //在调用域外修改值s.Display(); //检查值是否已经改变
}
另一个可能有用的例子是Math库中Max方法的变形。提供两个数字类型的变量,Math.Max
能够返回两个值中较大的那个。但是,假设你想返回的是包含较大值的变量的引用,而不是实际
的值。为此,你可以使用ref返回功能,如以下代码所示。
using static System.Console;class Program
{static ref int Max(ref int p1,ref int p2){if(p1>p2){return ref p1;//返回引用,而不是值}elsereturn ref p2;//返回引用,而不是值}static void Main(){int v1=10;int v2=20;WriteLine("Start");WriteLine($"v1:{v1},v2:{v2}\n");ref int max=ref Max(ref v1,ref v2);WriteLine("After assignment");WriteLine($"max:{max}\n");max++;WriteLine("After increment");WriteLine($"max:{max},v1:{v1},v2:{v2}");}
}
-
你不能将返回类型是void的方法声明为ref返回方法。
-
ref return表达式不能返回如下内容:
- 空值
- 常量
- 枚举成员
- 类或者结构体的属性
- 指向只读位置的指针
-
ref return表达式只能指向原先就在调用域内的位置,或者字段。所以,它不能指向方
法的局部变量。 -
即使将一个方法声明为ref返回方法,如果在调用该方法时省略了ref关键字,则返回的
将是值,而不是指向值的内存位置的指针。 -
如果将ref局部变量作为常规的实际参数传递给其他方法,则该方法仅获取该变量的一个
副本。尽管ref局部变量包含指向存储位置的指针,但是当以这种方式使用时,它会传递
值而不是引用。
相关文章:

C# 方法(ref局部变量和ref返回)
>本章内容: 方法的结构 方法体内部的代码执行 局部变量 局部常量 控制流 方法调用 返回值 返回语句和void方法 局部函数 参数 值参数 引用参数 引用类型作为值参数和引用参数 输出参数 参数数组 参数类型总结 方法重载 命名参数 可选参数 栈帧 递归 ref局部变量和ref返回 …...
C# 引用类型作为值参数与引用参数的区别
在编程中,我们常常需要处理引用类型对象,而将引用类型对象作为参数传递给方法时,有值参数和引用参数这两种方式,它们在方法内部操作时会产生不同的结果。下面就来详细分析这两种情况。 引用类型对象作为值参数传递 当我们把引用…...

滑动窗口,438找出字符串中所有字母的异位词
1.题目 2.解析 这道题我们用滑动窗口来实现,加上哈希表和vector容器的使用来实现这道题目,每次滑动之后我们都对其和答案进行比较,如果全部相等我们返回left,不相等继续滑动即可。 本质就是我们把p中相同数量的字母框起来&#…...

「国产嵌入式仿真平台:高精度虚实融合如何终结Proteus时代?」——从教学实验到低空经济,揭秘新一代AI赋能的产业级教学工具
引言:从Proteus到国产平台的范式革新 在高校嵌入式实验教学中,仿真工具的选择直接影响学生的工程能力培养与创新思维发展。长期以来,Proteus作为经典工具占据主导地位,但其设计理念已难以满足现代复杂系统教学与国产化技术需求。…...

《Python星球日记》 第52天:反向传播与优化器
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、引言二、反向传播算法原理简述1. 什么是反向传播?2. 从数学角度…...

Java常用类概述
Java常用类概述 一、字符串三剑客1. String(不可变字符串)2. StringBuilder(可变,线程不安全)3. StringBuffer(可变,线程安全) 二、日期时间类(重点掌握新版APIÿ…...
在现代Web应用中集成 PDF.js (pdfjs-dist 5.2 ESM): 通过 jsdelivr 实现动态加载与批注功能的思考
PDF 文档在现代 Web 应用中越来越常见,无论是作为文档预览、报告展示还是在线编辑的载体。Mozilla 的 PDF.js 是一个功能强大的 JavaScript 库,它使得在浏览器端渲染和显示 PDF 文件成为可能,无需依赖原生插件。 本文将深入探讨如何在你的项…...

C++STL——priority_queue
优先队列 前言优先队列仿函数头文件 前言 本篇主要讲解优先队列及其底层实现。 优先队列 优先队列的本质就是个堆,其与queue一样,都是容器适配器,不过优先队列是默认为vector实现的。priority_queue的接口优先队列默认为大根堆。 仿函数 …...
没有 Mac,如何把 iOS App 成功上架?
开发者的 iOS 上架折腾记:没有 Mac,也能搞定? 最近在帮朋友把一个跨平台 Flutter 项目上架到 App Store,结果被 iOS 上架的那套流程卡得头都大了。其实这也不是第一次碰壁了——每次到“申请证书 打包 上传”的时候,…...
C++ Vector深度易错点指南(临时抱佛脚)(基础用法;进阶;高级;实战)
Vector 1. Vector 基础概念1.1 内存结构1.2 初始化方法2.1 访问方式对比2.2 遍历流程3.1 扩容流程3.2 迭代器失效3.2.1 插入操作导致迭代器失效3.2.2 删除操作导致迭代器失效3.2.3 避免迭代器失效的建议4.1 排序与去重排序去重性能分析4.2 查找与条件删除查找条件删除性能分析5…...

深入解析WPF中的3D图形编程:材质与光照
引言 在Windows Presentation Foundation (WPF) 中创建三维(3D)图形是一项既有趣又具有挑战性的任务。为了帮助开发者更好地理解如何使用WPF进行3D图形的渲染,本文将深入探讨GeometryModel3D类及其相关的材质和光源设置。 1、GeometryModel3D类简介 GeometryMode…...

SolidWork-2023 鼠標工程
地址 https://github.com/MartinxMax/SW2023-Project/tree/main/mouse 鼠標...

vscode预览模式(点击文件时默认覆盖当前标签,标签名称显示为斜体,可通过双击该标签取消)覆盖标签、新窗打开
文章目录 VS Code 预览模式如何取消预览模式(即“固定”标签页)?预览模式有什么用? VS Code 预览模式 在 VS Code 中,当你单击文件浏览器(例如,资源管理器侧边栏)中的某个文件时&am…...

记录踩过的坑-金蝶云苍穹平台-轻分析和轻报表(慢慢更新)
未发现AppIdName(qing rpt)服务或访问服务网络异常 前提是有许可和权限。 去console(云基础平台控制台),点击服务管理,编辑mservice-更新升级-环境变量,在appIds里增加qing_rpt 查看数据库 如果是采用公共数据源连接…...

每日一题洛谷T534125 合数c++
字符串输入,看所有位数加起来的数是不是3的倍数 是,直接输出,不是,删除1或2 特判全是1和全是2的情况 直接检测末尾数字可以特判2 特判1时,还要特判11和111,其他数字,k是奇数时是质数&#x…...

数据链共享:从印巴空战到工业控制的跨越性应用
摘要 本文通过对印巴空战中数据链共享发挥关键作用的分析,引出数据链共享在工业控制领域同样具有重大价值的观点。深入阐述 DIOS 工业控制操作系统作为工业数据链共享基础技术的特点、架构及应用优势,对比空战场景与工业控制场景下数据链共享的相…...
Go多服务项目结构优化:为何每个服务单独设置internal目录?
文章目录 Go多服务项目结构优化:为何每个服务单独设置internal目录?背景什么是 Go 的 internal 机制?传统根 internal 目录的局限为什么要每个服务单独设置 internal ?推荐结构示例 总结 Go多服务项目结构优化:为何每个…...

图解gpt之Seq2Seq架构与序列到序列模型
今天深入探讨如何构建更强大的序列到序列模型,特别是Seq2Seq架构。序列到序列模型,顾名思义,它的核心任务就是将一个序列映射到另一个序列。这个序列可以是文本,也可以是其他符号序列。最早,人们尝试用一个单一的RNN来…...

Linux--JsonCpp
1.JsonCpp 简介 JsonCpp 是一个用于 C 的 JSON 解析和生成库,支持 JSON 数据的读写、解析和序列化。它提供了简单的 API 来操作 JSON 对象、数组、字符串、数字等类型,是 C 开发中处理 JSON 数据的常用工具。 核心功能与类 JsonCpp 主要包含以下核心类…...
程序代码篇---Python视频流
文章目录 前言一、OpenCV 视频流处理1. 视频捕获基础2. 视频流属性设置与获取3. 视频写入 二、高级视频流操作1. 多摄像头处理2. 视频流帧处理3. 视频流分析与统计 三、其他视频处理库1. PyAV (FFmpeg 的 Python 绑定)2. imageio 四、视频流处理优化技巧1. 多线程视频处理2. 视…...

如何利用 QuickAPI 生成 PostgreSQL 样本测试数据:全面解析与实用指南
目录 一、什么是 QuickAPI? 二、为什么需要生成样本测试数据? 三、如何在 QuickAPI 中生成 PostgreSQL 样本测试数据? 1. 登录 QuickAPI 平台 2. 选择 PostgreSQL 数据库和目标表 3. 配置样本数据生成规则 4. 导出或直接插入数据 四、…...

DeepSeek API接口调用示例(开发语言C#,替换其中key值为自己的key值即可)
示例: DeepSeek官方接口说明文档:对话补全 | DeepSeek API Docs 官网暂未提供C#代码实现:(以下为根据CURL接口C#代码调用) using System; using System.Collections.Generic; using System.Linq; using System.Text; …...

远程调试---在电脑上devtools调试运行在手机上的应用
1、启动项目–以vite项目为例:先ipconfig查看ip地址 ,然后在vite中配置host为ip地址 2、手机上查看项目:保证手机和电脑在同一局域网, 在手机浏览器打开我们vite启动的项目地址, 3、使用chii进行远程调试 (1) 安装 npm install chii -g (2)启动 chii start -p 8080 (3)在…...

[git]如何关联本地分支和远程分支
主题 本文总结如何关联git本地分支和远程分支的相关知识点。 详情 查看本地分支 git branch 查看远程分支 git branch -r 查看所有分支(本地远程) git branch -a 查看本地分支及其关联的远程分支(如有) git branch -vv 关联本地分支到远程分支: git branch …...
集群/微服务/分布式
目录 介绍 集群 微服务 优点 缺点 如何管理和监控微服务架构中的多个微服务? 服务治理 配置管理 监控与告警 容器化与编排 安全管理 分布式 三者关系 分布式和集群的区别是什么? 概念 工作方式 节点角色 应用场景 故障处理 微服务 微…...
红黑树删除的实现与四种情况的证明
🧭 学习重点 删除节点的三种情况红黑树如何恢复性质四种修复情况完整可运行的 C 实现 一、红黑树删除的基础理解 红黑树删除比插入复杂得多,因为: 删除的是黑节点可能会破坏“从根到叶子黑节点数相等”的性质。删除红节点无需修复…...
【Spring AI 实战】基于 Docker Model Runner 构建本地化 AI 聊天服务:从配置到函数调用全解析
【Spring AI 实战】基于 Docker Model Runner 构建本地化 AI 聊天服务:从配置到函数调用全解析 前沿:本地化 AI 推理的新范式 随着大语言模型(LLM)应用的普及,本地化部署与灵活扩展成为企业级 AI 开发的核心需求。Do…...
前台--Android开发
在 Android 开发中,“前台(Foreground)” 是一个非常重要的概念,它用于描述当前用户正在与之交互的组件或应用状态。理解“前台”的含义有助于更好地管理资源、生命周期和用户体验。 ✅ 一、什么是前台? 简单定义&…...

跨境电商生死局:动态IP如何重塑数据生态与运营效率
凌晨三点的深圳跨境电商产业园,某品牌独立站运营总监李明(化名)正盯着突然中断的广告投放系统。后台日志显示,过去24小时内遭遇了17次IP封禁,直接导致黑五促销期间损失23%的预期流量。这并非个案——2023年跨境电商行业…...

springboot3+vue3融合项目实战-大事件文章管理系统-更新用户信息
在一下三个代码处进行修改 在UserController里面增加uadate方法 PutMapping ("/update")public Result update(RequestBody Validated User user){userService.update(user);return Result.success();}在userservice中增加update方法 void update(User user); 然…...