c#方法关键字,ref、out、int

在 C# 中,refoutin 是用于方法参数传递的关键字,它们控制参数如何在方法和调用者之间传递数据。以下是对这三个关键字的详细分析:

1. ref 关键字(引用传递)

作用
  • 允许方法修改调用者的变量:通过引用传递变量,方法内部对参数的修改会直接反映到调用者的原始变量上。

  • 要求变量必须在传递前初始化:调用者必须先给变量赋值,否则会编译错误。

示例
void Main()
{int x = 10;AddOne(ref x); // 传递变量的引用Console.WriteLine(x); // 输出:11
}
​
void AddOne(ref int num)
{num++; // 修改引用的变量
}
特点
  • 双向数据流动:参数可以在方法中读取和修改。

  • 显式声明:方法定义和调用时都必须使用 ref 关键字。

2. out 关键字(输出参数)

作用
  • 强制方法为参数赋值:方法必须在返回前为 out 参数赋值,否则会编译错误。

  • 允许返回多个值:常用于需要从方法中返回多个结果的场景。

示例
void Main()
{int result;bool success = TryParse("123", out result); // 传递未初始化的变量if (success){Console.WriteLine(result); // 输出:123}
}
​
bool TryParse(string input, out int number)
{if (int.TryParse(input, out number)){return true;}number = 0; // 必须赋值,即使解析失败return false;
}
特点
  • 单向数据流动:参数仅用于从方法输出值,方法内部必须先赋值才能使用。

  • 显式声明:方法定义和调用时都必须使用 out 关键字。

  • 变量无需提前初始化:调用者可以传递未初始化的变量,但方法内部必须确保赋值。

3. in 关键字(只读引用传递,C# 7.2+)

作用
  • 以引用方式传递参数,但禁止方法修改它:用于性能优化,避免值类型的复制开销,同时保证参数不被修改。

  • 要求变量必须在传递前初始化:调用者必须提供已赋值的变量。

示例
void Main()
{int x = 10;PrintValue(in x); // 传递只读引用// x 不能在方法内部被修改
}
​
void PrintValue(in int num)
{Console.WriteLine(num); // 读取值// num = 20; // 编译错误:不能修改 in 参数
}
特点
  • 单向数据流动:参数只能被读取,不能被修改。

  • 显式声明:方法定义和调用时都必须使用 in 关键字。

  • 性能优化:对于大型值类型(如结构体),避免复制整个实例。

4. 核心区别对比

特性refoutin
变量初始化要求调用前必须初始化调用前无需初始化调用前必须初始化
方法内是否必须赋值否(可直接使用传入的值)是(必须在返回前赋值)否(禁止修改参数)
数据流动方向双向(读取和修改)单向(仅输出)单向(仅输入)
性能影响避免值复制(值类型)避免值复制(值类型)避免值复制(值类型)
常见场景修改调用者的变量返回多个结果(如 TryParse大型值类型的只读访问

5. 注意事项

  1. 方法重载

    :不能仅通过 ref、out、in

    区分重载方法,因为调用时语法相同。

    void Foo(ref int x) {}
    void Foo(out int x) {} // 编译错误:无法重载仅按 ref/out 区分的方法
  2. 性能考虑:

    • refout 对引用类型无性能提升(本身传递的就是引用)。

    • in 对大型值类型(如结构体)可显著提升性能。

  3. 兼容性refoutin 是方法签名的一部分,重写方法时必须保持一致。

总结

  • 使用 ref:当需要方法修改调用者的变量,且变量已初始化时。

  • 使用 out:当需要方法返回多个结果,或强制方法为参数赋值时。

  • 使用 in:当需要以引用方式传递参数,但禁止方法修改它时(性能优化)。

合理使用这些关键字可以提高代码的灵活性、性能和安全性,但应避免过度使用,以免降低代码的清晰度。

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

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

相关文章

设计模式—初识设计模式

1.设计模式经典面试题分析几个常见的设计模式对应的面试题。1.1原型设计模式1.使用UML类图画出原型模式核心角色(意思就是使用会考察使用UML画出设计模式中关键角色和关系图等)2.原型设计模式的深拷贝和浅拷贝是什么,写出深拷贝的两种方式的源…

深度学习-参数初始化、损失函数

A、参数初始化参数初始化对模型的训练速度、收敛性以及最终的性能产生重要影响。它可以尽量避免梯度消失和梯度爆炸的情况。一、固定值初始化在神经网络训练开始时,将权重或偏置初始化为常数。但这种方法在实际操作中并不常见。1.1全零初始化将所有的权重参数初始化…

格密码--Ring-SIS和Ring-LWE

1. 多项式环&#xff08;Polynomial Rings&#xff09; 设 f∈Z[x]f \in \mathbb{Z}[x]f∈Z[x] 是首一多项式&#xff08;最高次项系数为1&#xff09; 则环 RZ[x]/(f)R \mathbb{Z}[x]/(f)RZ[x]/(f) 元素为&#xff1a;所有次数 <deg⁡(f)< \deg(f)<deg(f) 的多项式…

前端工作需要和哪些人打交道?

前端工作中需要协作的角色及协作要点 前端工作中需要协作的角色及协作要点 前端开发处于产品实现的 “中间环节”,既要将设计方案转化为可交互的界面,又要与后端对接数据,还需配合团队推进项目进度。日常工作中,需要频繁对接的角色包括以下几类,每类协作都有其核心目标和…

万字长文解析 OneCode3.0 AI创新设计

一、研究概述与背景 1.1 研究背景与意义 在 AI 技术重塑软件开发的浪潮中&#xff0c;低代码平台正经历从 “可视化编程” 到 “意图驱动开发” 的根本性转变。这种变革不仅提升了开发效率&#xff0c;更重新定义了人与系统的交互方式。作为国内领先的低代码平台&#xff0c;On…

重学前端006 --- 响应式网页设计 CSS 弹性盒子

文章目录盒模型一、盒模型的基本概念二、两种盒模型的对比 举例三、总结Flexbox 弹性盒子布局一、Flexbox 的核心概念​​二、Flexbox 的基本语法​​​​1. 定义 Flex 容器​​​2. Flex 容器的主要属性​​​​3. Flex 项目的主要属性​​​​三、Flexbox 的常见布局示例​​…

rLLM:用于LLM Agent RL后训练的创新框架

rLLM&#xff1a;用于LLM Agent RL后训练的创新框架 本文介绍了rLLM&#xff0c;一个用于语言智能体后训练的可扩展框架。它能让用户轻松构建自定义智能体与环境&#xff0c;通过强化学习进行训练并部署。文中还展示了用其训练的DeepSWE等智能体的出色表现&#xff0c;以及rLL…

rocky8 --Elasticsearch+Logstash+Filebeat+Kibana部署【7.1.1版本】

软件说明&#xff1a; 所有软件包下载地址&#xff1a;Past Releases of Elastic Stack Software | Elastic 打开页面后选择对应的组件及版本即可&#xff01; 所有软件包名称如下&#xff1a; 架构拓扑&#xff1a; 集群模式&#xff1a; 单机模式 架构规划&#xff1a…

【JVM】内存分配与回收原则

在 Java 开发中&#xff0c;自动内存管理是 JVM 的核心能力之一&#xff0c;而内存分配与回收的策略直接影响程序的性能和稳定性。本文将详细解析 JVM 的内存分配机制、对象回收规则以及背后的设计思想&#xff0c;帮助开发者更好地理解 JVM 的 "自动化" 内存管理逻辑…

Qt获取hid设备信息

Qt 中通过 HID&#xff08;Human Interface Device&#xff09;接口获取指定的 USB 设备&#xff0c;并读取其数据。资源文件中包含了 hidapi.h、hidapi.dll 和 hidapi.lib。通过这些文件&#xff0c;您可以在 Qt 项目中实现对 USB 设备的 HID 接口调用。#include <QObject&…

Anaconda Jupyter 使用注意事项

Anaconda Jupyter 使用注意事项 1.将cell转换为markdown。 First, select the cell you want to convertPress Esc to enter command mode (the cell border should turn blue)Press M to convert the cell to Markdown在编辑模式下按下ESC键&#xff0c;使单元块&#xff08;c…

[硬件电路-20]:模拟信号处理运算与数字信号处理运算的相同点与不同点

模拟信号处理运算与数字信号处理运算是信号处理领域的两大核心方法&#xff0c;二者在信号形式、处理机制、性能特点和应用场景上存在显著差异&#xff0c;但也共享一些基础目标与理论支撑。以下从多个维度进行系统对比分析&#xff1a;一、相同点1. 核心目标一致信号变换与分析…

Redis 高频面试题

1. 缓存穿透 1.1 描述 用户想要查询某个数据,在 Redis 中查询不到,即没有缓存命中,这时就会直接访问数据库进行查询。当请求量超出数据库最大承载量时,就会导致数据库崩溃。这种情况一般发生在非正常 URL 访问,目的不是为了获取数据,而是进行恶意攻击。 1.2 现象 1、应…

OWASP Top 10 攻击场景实战

OWASP (开放式Web应用程序安全项目) Top 10 榜单是全球公认的、针对Web应用最关键安全风险的权威指南。它不是一份详尽无遗的清单&#xff0c;而是一份凝聚了安全专家共识的“高危预警”。本文将不止于罗列这些风险&#xff0c;而是深入每个风险的核心&#xff0c;通过生动的比…

Three.js 实战:使用 PBR 贴图打造真实地面材质

在 Three.js 中&#xff0c;我们可以通过 MeshStandardMaterial 材质配合多张贴图来实现真实的地面效果。这种方式模拟了物理世界中光照与表面材质的复杂交互&#xff0c;常用于构建高质量场景&#xff0c;如数字孪生、建筑可视化、游戏等。 本文将以一个完整示例为基础&#x…

Java基础的总结问题(第一篇)

JDK和JRE的区别&#xff1f;JRE是Java运行环境&#xff08;Java Runtime Environment&#xff09;&#xff0c;包含了JVM和Java核心类库JDK是Java开发工具包&#xff08;Java Developers Kit&#xff09;,包含了JRE和Java常见的开发工具与equals的区别&#xff1f;可以用来比较…

[智能算法]MOEA/D算法的Python实现

一、初始化不同于NSGA-II&#xff0c;MOEA/D在进行迭代之前需要先进行初始化&#xff0c;初始化的主要内容是计算个体向量权重之间的欧氏距离&#xff0c;并得出其邻域集合。# 计算T个邻居 def cpt_W_Bi_T(moead):# 设置的邻居个数错误(自己不能是自己的邻居)if moead.T_size &…

Java设计模式之-组合模式

什么是组合模式&#xff1f; 组合模式允许你将对象组合成树形结构来表示"部分-整体"的层次结构。它让客户端能够以统一的方式处理单个对象和对象组合。 简单来说&#xff0c;就像公司的组织结构&#xff1a; 公司有部门部门有小组小组有员工但无论是对公司、部门还是…

2021-10-29 C++与反转数的和

缘由输入一个三位数 与它倒过来的数相加&#xff0c;输出和-编程语言-CSDN问答 直接写 int n0,nn0,nnn0; cin>>n;nnn; while(nn)nnn*10,nnnnn%10,nn/10; cout<<nnnn<<endl; 缘由https://ask.csdn.net/questions/7552128 int 反转数(int n) { int nn 0…

论安全架构设计(威胁与措施)

安全架构威胁与措施摘要2021年4月&#xff0c;我有幸参与了某保险公司的“优车险”项目的建设开发工作&#xff0c;该系统以车险报价、车险投保和报案理赔为核心功能&#xff0c;同时实现了年检代办、道路救援、一键挪车等增值服务功能。在本项目中&#xff0c;我被安排担任架构…