百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

C#基础:ref 参数

zhezhongyun 2025-05-14 18:24 21 浏览

在 C# 中,ref 关键字用于指示方法参数是引用参数。引用参数允许您将对变量的引用作为参数传递给方法,而不是传递变量值的副本。这意味着在方法中对参数所做的任何更改也会影响方法外部的原始变量。

在下面,我们定义了 ref 方法的语法。ref 方法具有 retrun 类型,例如 int、float 或 string,以及一个 methodName,它可以是方法的任何合适名称,我们定义了参数 ref 与第一个 ref keword,然后它将具有任何数据类型,例如 int、string 和参数名称,例如 referenceParameter,在下面的语法中,我们定义了使用此 ref 参数的参数主体,并将赋值给此 ref 参数。

Bash
returnType methodName(parameters, ref dataType referenceParameter) { // Method body // The method assigns a value to referenceParameter // ... }

ref 参数的基本结构

方法签名:

定义接受 ref 关键字的方法时,请在方法签名中的参数类型之前指定 ref 关键字。

参数传递:

调用该方法时,还必须使用 ref 关键字来指示要传递对变量的引用。

使用简单变量的示例一

在下面的示例中,我们有私有类 Program,这个 Program 类有 Main 入口方法。在 Main 入口方法中,我们定义了 SimpleWithRef 方法,该方法没有任何返回类型,并且具有整数类型 x 的 ref 参数。在 SimpleWithRef 方法的主体中,我们为 x 变量分配了一个值。实际上,我们正在用新的值修改现有的值。在 SimpleWithRef 方法之外,我们声明了一个整数类型 x vaiable,并为此 x 变量赋值了 10 值。我们在调用 SimpleWithRef 方法之前打印 x 变量的值。即通话前的 10 点。在此之后,我们调用 SimpleWithRef 函数,该函数必须具有 ref 关键字,然后是变量名称 x。在此之后,我们再次打印 x 的值。现在,您可以监控 x 参数的原始值在调用后是否发生了变化。现在已经变成了 30 岁。

Bash
using System;public class Program{public static void Main(string[] args) {void Simple(int y) { y = 40; //Not Modifies the original 'y' variable }void SimpleWithRef(ref int x) { x = 30; // Modifies the original 'x' variable }int x = 10; Console.WriteLine("Before call x value is=" + x);SimpleWithRef(ref x); // Calling the SimpleWithRef function Console.WriteLine("After call x value is=" + x);int y = 20; Console.WriteLine("Before cal y value is=" + y);Simple(y); // Calling the Simple function Console.WriteLine("After call y value is=" + y); }}

输出

Before call x value is=10 
After call x value is=30
Before cal y value is=20
After call y value is=20

带有类的示例 2

using System;
public class Program
{
public static void Main(string[] args)
{
Fruit objFruit = new Fruit(18, "WaterMelon", true);
int fieldPrice = objFruit.GetFruitPrice(); // Accessing a field fruit price
string fieldName = objFruit.GetFruitName(); // Accessing a field fruit name
bool fieldIsInMarket = objFruit.GetFruitIsInMarket(); // Accessing a field fruit is in market


Console.WriteLine("Fruit result before using ref keword");
Console.WriteLine("Fruit name: " + fieldName + " Fruit price:" + fieldPrice + " Is available in summer :" + fieldIsInMarket);


objFruit.SetFruit(ref objFruit.FruitPrice, ref objFruit.FruitName, ref objFruit.FruitIsAvialableInSummer);
Console.WriteLine("Fruit result after using ref keword without class");
Console.WriteLine("Fruit name: " + objFruit.FruitName + " Fruit price:" + objFruit.FruitPrice + " Is available in summer :" + objFruit.FruitIsAvialableInSummer);


objFruit.SetNewFruit(ref objFruit);
Console.WriteLine("Fruit result after using ref keword with class");
Console.WriteLine("Fruit name: " + objFruit.FruitName + " Fruit price:" + objFruit.FruitPrice + " Is available in summer :" + objFruit.FruitIsAvialableInSummer);


}
}


public class Fruit
{
// Fields (attributes or variables)
public int FruitPrice;
public string FruitName;
public bool FruitIsAvialableInSummer;


// Constructor
public Fruit(int price, string name, bool isAvailable)
{
FruitPrice = price;
FruitName = name;
FruitIsAvialableInSummer = isAvailable;
}


// Methods (functions or behaviors)
public int GetFruitPrice()
{
return FruitPrice;
}


public string GetFruitName()
{
return FruitName;
}


public bool GetFruitIsInMarket()
{
return FruitIsAvialableInSummer;
}


public void SetFruit(ref int FruitPrice, ref string FruitName, ref bool FruitIsAvialableInSummer)
{
FruitPrice = 28;
FruitName = "Orange";
FruitIsAvialableInSummer = false;
}


public void SetNewFruit(ref Fruit fruitChange)
{
fruitChange.FruitPrice = 23;
fruitChange.FruitName = "Mango";
fruitChange.FruitIsAvialableInSummer = true;
}
}

输出

Fruit result before using ref keword 
Fruit name: WaterMelon Fruit price:18 Is available in summer :True
Fruit result after using ref keword without class
Fruit name: Orange Fruit price:28 Is available in summer :False
Fruit result after using ref keword with class
Fruit name: Mamgo Fruit price:23 Is available in summer :True

使用 struct 的示例 3

using System;
public class Program
{
public static void Main(string[] args)
{
Point p1 = new Point(10, 20);
Point p2 = p1; // Copying p1 to p2
p2.SetValuePoint(ref p2);
Console.WriteLine($"p1: {p1}"); // Output: p1: (10, 20)
Console.WriteLine($"p2: {p2}"); // Output: p2: (30, 20)
}
}


public struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}


public override string ToString()
{
return $"({X}, {Y})";
}


public void SetValuePoint(ref Point p2)
{
p2.X = 30; // Modifying p2
}
}

输出

p1: (10, 20) 
p2: (30, 20)

为什么我们使用 ref 关键字?

1. 修改原始值:

当需要修改原始变量时,将方法的声明范围排除在外。

2. 复制大型数据结构

当您需要将大型数据结构从一个位置传递到另一个位置时。您可以使用 ref kayword 传递这些大数据,以避免在更改所需位置后复制数据。

3. 恢复多个值

当您需要返回多个值时,您可以使用 ref 关键字。

我们可以通过 ref 关键字将变量或类变量的原始值更改为另一个类,因为 ref 关键字构成了变量或类引用类型。

如果你喜欢我的文章,请给我一个赞!谢谢

相关推荐

JavaScript做个贪吃蛇小游戏(过关-加速),无需网络直接玩。

JavaScript做个贪吃蛇小游戏(过关-则加速)在浏览器打开文件,无需网络直接玩。<!DOCTYPEhtml><htmllang="en"><...

大模型部署加速方法简单总结(大模型 ai)

以下对大模型部署、压缩、加速的方法做一个简单总结,为后续需要备查。llama.cppGithub:https://github.com/ggerganov/llama.cppLLaMA.cpp项...

安徽医大第一医院应用VitaFlow Liberty(R)Flex为患者焕然一“心”

近日,在安徽医科大学第一附属医院心血管内科负责人暨北京安贞医院安徽医院业务副院长喻荣辉教授的鼎力支持和卓越带领下,凭借着先进的VitaFlowLiberty(R)Flex经导管主动脉瓣可回收可...

300 多行代码搞定微信 8.0 的「炸」「裂」特效!

微信8.0更新的一大特色就是支持动画表情,如果发送的消息只有一个内置的表情图标,这个表情会有一段简单的动画,一些特殊的表情还有全屏特效,例如烟花表情有全屏放烟花的特效,炸弹表情有爆炸动画并且消息和...

让div填充屏幕剩余高度的方法(div填充20px)

技术背景在前端开发中,经常会遇到需要让某个div元素填充屏幕剩余高度的需求,比如创建具有固定头部和底部,中间内容区域自适应填充剩余空间的布局。随着CSS技术的发展,有多种方法可以实现这一需求。实现步骤...

css之div内容居中(css中div怎么居中)

div中的内容居中显示,包括水平和垂直2个方向。<html><head><styletype="text/css">...

使用uniapp开发小程序遇到的一些问题及解决方法

1、swiper组件自定义知识点swiper组件的指示点默认是圆圈,想要自己设置指示点,需要获得当前索引,然后赋给当前索引不同的样式,然后在做个动画就可以了。*关键点用change方法,然后通过e.d...

微信小程序主页面排版(怎样设置小程序的排版)

开发小程序的话首先要了解里面的每个文件的作用小程序没有DOM对象,一切基于组件化小程序的四个重要的文件*.js*.wxml--->view结构---->html*.wxss--...

Vue动态组件的实践与原理探究(vue动态组件component原理)

我司有一个工作台搭建产品,允许通过拖拽小部件的方式来搭建一个工作台页面,平台内置了一些常用小部件,另外也允许自行开发小部件上传使用,本文会从实践的角度来介绍其实现原理。ps.本文项目使用VueCLI...

【HarmonyOS Next之旅】兼容JS的类Web开发(四) -> tabs

目录1->创建Tabs2->设置Tabs方向3->设置样式4->显示页签索引5->场景示例编辑1->创建Tabs在pages/index目录...

CSS:前端必会的flex布局,我把布局代码全部展示出来了

进入我的主页,查看更多CSS的分享!首先呢,先去看文档,了解flex是什么,这里不做赘述。当然,可以看下面的代码示例,辅助你理解。一、row将子元素在水平方向进行布局:1.垂直方向靠顶部,水平方向靠...

【HarmonyOS Next之旅】兼容JS的类Web开发(四) -> swiper

目录1->创建Swiper组件2->添加属性3->设置样式4->绑定事件5->场景示例编辑1->创建Swiper组件在pages/index...

CSS:Flex布局,网页排版神器!(css3 flex布局)

还在为网页排版抓狂?别担心,CSS的flex布局来了,让你轻松玩转各种页面布局,实现网页设计自由!什么是Flex布局?Flex布局,也称为弹性布局,是CSS中的一种强大布局方式,它能够让你...

移动WEB开发之flex布局,附携程网首页案例制作

一、flex布局体验传统布局兼容性好布局繁琐局限性,不能再移动端很好的布局1.1flex弹性布局:操作方便,布局极为简单,移动端应用很广泛PC端浏览器支持情况较差IE11或更低版本,不支持或仅部...

2024最新升级–前端内功修炼 5大主流布局系统进阶(mk分享)

2024最新升级–前端内功修炼5大主流布局系统进阶(mk分享)获课》789it.top/14658/前端布局是网页设计中至关重要的一环,它决定了网页的结构和元素的排列方式。随着前端技术的不断发展,现...