C#方法中的ref和out

C#学习笔记-方法参数params、ref和in、out 目录params用法ref用法按引用传递参数引用返回值引用局部变量in用法特殊注意点优势out用法版本变迁信息其他ref、in和out三者异同方法重载 C#中ref和out关键字的应用以及区别。 官方文档 编写安全有效的 C# 代码 params 指定此参数采用可变数量的参数。 in 指定此参数由引用传递,但只由调用方法读取。 ref 指定此参数由引用传递,可能由调用方法读取或写入。 out 指定此参数由引用传递,由调用方法写入。 params 使用 params 关键字可以指定采用数目可变的参数 阅读详情
ref    
    通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不将受到影响.此外我们还有其他向方法传递参数的形式,引用(ref)和输出(out).
    有时,我们需要改变原来变量中的值,这时,我们可以向方法传递变量的引用,而不是变量的值.引用是一个变量,他可以访问原来变量的值,修改引用将修改原来变量的值.变量的值存储在内存中,可以创建一个引用,他指向变量在内存中的位置.当引用被修改时,修改的是内存中的值,因此变量的值可以将被修改.当我们调用一个含有引用参数的方法时,方法中的参数将指向被传递给方法的相应变量,因此,我们会明白,为什么当修改参数变量的修改也将导致原来变量的值.
    创建参数按引用传递的方法,需使用关键字ref.例;
    using System;
    class gump
    {
public double square(ref double x)
{
  x=x*x;
  return x;
}
    }

    class TestApp
    {
public static void Main()
{
  gump doit=new gump();

  double a=3;
  double b=0;

  Console.WriteLine("Before square->a={0},b={1}",a,b);

  b=doit.square(ref a);
  Console.WriteLine("After square->a={0},b={1}",a,b);
}
    }

    通过测试,我们发现,a的值已经被修改为9了.

out
    通过指定返回类型,可以从方法返回一个值,有时候(也许还没遇到,但是我们应该有这么个方法),需要返回多个值,虽然我们可以使用ref来完成,但是C#专门提供了一个属性类型,关键字为out.介绍完后,我们将说明ref和out的区别.
    using System;
    class gump
    {
public void math_routines(double x,out double half,out double squared,out double cubed)
//可以是:public void math_routines(//ref double x,out double half,out double squared,out double cubed)
//但是,不可以这样:public void math_routines(out double x,out double half,out double squared,out double cubed),对本例来说,因为输出的值要靠x赋值,所以x不能再为输出值
{
  half=x/2;
  squared=x*x;
  cubed=x*x*x;
}
    }

    class TestApp
    {
public static void Main()
{
    gump doit=new gump();

    double x1=600;
    double half1=0;
    double squared1=0;
    double cubed1=0;
    
    /*
     double x1=600;
     double half1;
     double squared1;
     double cubed1;
    */

    Console.WriteLine("Before method->x1={0}",x1);
    Console.WriteLine("half1={0}",half1);
    Console.WriteLine("squared1={0}",squared1);
    Console.WriteLine("cubed1={0}",cubed1);

    doit.math_rountines(x1,out half1,out squared1,out cubed1);
    
    Console.WriteLine("After method->x1={0}",x1);
    Console.WriteLine("half1={0}",half1);
    Console.WriteLine("squared1={0}",squared1);
    Console.WriteLine("cubed1={0}",cubed1);
}
    }

    通过使用out关键字,我们改变了三个变量的值,也就是说out是从方法中传出值.

    我们发现,ref和out似乎可以实现相同的功能.因为都可以改变传递到方法中的变量的值.但是,二者本质本质的区别就是,ref是传入值,out是传出值.在含有out关键字的方法中,变量必须由方法参数中不含out(可以是ref)的变量赋值或者由全局(即方法可以使用的该方法外部变量)变量赋值,out的宗旨是保证每一个传出变量都必须被赋值.
    上面代码中被/**/注释掉的部分,可以直接使用.也就是说,在调用方法前可以不初始化变量.但是"x1"是要赋值的,否则要报错.而ref参数,在传递给方法时,就已经是还有值的了,所以ref侧重修改.out侧重输出.
CS1988|C#无法在异步方法中使用ref,in,out类型的参数的问题 参数,因为当控件返回到调用代码时,该方法可能尚未完成。对引用变量的任何更改都对调用代码不可见,从而导致 CS1988 错误。BlazorServer的场景中推荐使用异步方法,使用ref,out,in为参数前缀则报错CS1988。如果要在async方法中获取一些返回值,请直接加在的Task的返回中。如果是一些运行时间长的方法,则可能造成一些响应不及时的效果。将需要用到的参数作为Task的返回,即。应避免使用引用类型为参数来充当返回值。现有Blazor页面如下。延申:引用变量的可见性。在方法的运行时间内, 阅读详情

相关推荐

RimWorld Mod开发避坑指南:从Defs命名规范到XML结构详解(附实战代码)

本文深入解析RimWorld Mod开发中Defs文件的编写规范与高级技巧,涵盖命名冲突预防、XML结构优化及高级功能实现。通过实战代码示例,帮助开发者避开常见陷阱,提升Mod兼容性与稳定性,特别适合RimWorld Mod开发者参考。

weixin_30790841的博客 451

MVC Ref

细说@Html.ActionLink()的用法

weixin_43520832的博客 173

微腔光频梳仿真入门:MATLAB求解LLE方程全流程解析

光学频率梳在精密测量、光通信和微波光子学中有着广阔应用,而微环谐振腔中的Kerr非线性与四波混频效应能够紧凑地产生宽带梳齿。仿真这类系统的核心是求解Lugiato-Lefever方程(LLE),但直接从物理参数到数值代码往往让初学者无从下手。本文从微腔光频梳的物理图像出发,介绍LLE方程的推导与归一化方法,并重点讲解MATLAB数值实现的两种思路:基于ode45的频域耦合方程组求解与分裂步长RK4IP方法。同时讨论失谐扫描、孤子态识别、参数稳定性边界,以及如何将真实器件参数换算为无量纲仿真参数。无论你是刚接

weixin_32325225的博客 293

spring mvc中xml配置文件中ref 和value的区别

ref:代表的是引用这个对象,ref代表的是引用这个对象,ref代表的是引用这个对象value:是引入的这个对象名字的字符串,value是引入的这个对象名字的字符串,value是引入的这个对象名字的字符串...

m0_55773510的博客 937

AppleAccount注册之生成sign

根据日志发现:签名来自于AuthKit的-[AKAppleIDServerResourceLoadDelegate signRequest:withCompletionHandler:]的一个block,这个库是放在共享缓存库里的,找到提前准备好的IDA文件,先去找主方法,根据分析IDA,最后找到了实际生成签名的方法:t1。,接受五个参数,context(之前讲的获取到的客户端证书),bytes(待加密的body字节),length(字节长度),以及两个接受结果的参数,直接进这个方法看,

2503_90751938的博客 1006

别再死磕官方文档了!用宿舍开黑的故事,5分钟搞懂Autosar CanNM网管报文

本文通过宿舍开黑游戏的生动类比,深入浅出地解析了Autosar CanNM网管报文的工作原理。从游戏队友协作到汽车ECU节点的同步机制,详细介绍了网管报文的唤醒流程、通信协议及休眠策略,帮助读者快速掌握这一关键技术。

weixin_30463341的博客 262

Spring配置文件中使用ref local与ref bean的区别.

Spring配置文件中使用ref local与ref bean的区别.在ApplicationResources.properties文件中,使用与方法如下:            class = "org.springframework.transaction.interceptor.TransactionProxyFactoryBean" >                          

lerrywang008的专栏 928

RK3568平台(USB篇)USB Gadget 驱动

USB 设备驱动,按照设备端关联的 USB 控制器 是工作在 主模式 还是 从模式,分为 USB 设备主机侧驱动 (主模式),或者 USB 设备从机侧驱动 (从模式)。同时,工作在 主模式 的 USB 控制器,称为 USB 主机控制器 (UHC: USB Host Controller),工作在 从模式 的 USB 控制器,称为 USB 设备控制器 (UDC: USB Device Controller)。有的 USB 控制器,只能工作在 主模式 或 从模式 中的某一种;

weixin_49303682的博客 1438

java ref out_C#方法中的ref和out

C#方法中的ref和out{大部分参照<<21天学通C#>>,小部分写了自己的感受,编程功底比较差,只能写这么多,多包涵}ref通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不将受到影响.此外我们还有其他向方法传递参数的形式,引用(ref)和输出(out).有时,我们需要改变原来变量中的值,这时,我...

weixin_34331737的博客 393

Android 14 (AOSP) 源码架构深度解析与开发者指南

Android14源码的仓库指南信息

保持专注,保持热爱 1186

PointNet++改进策略 :模块改进 | x-Conv | PointCNN, 结合局部结构与全局排列提升模型性能

这篇论文介绍了一种名为PointCNN的方法,旨在从点云(point cloud)数据中学习特征。传统卷积神经网络(CNN)在处理规则网格数据(如图像)时非常有效,但由于点云是无序且不规则的,直接在其上应用卷积操作会导致形状信息丢失,并对点的排列顺序敏感。为了解决这一问题,论文提出了一种X-Conv操作。该方法通过学习一种来重新排列点云中的点并加权输入特征。然后,将典型的卷积操作应用于转换后的特征。这种方法将传统的 CNN 扩展到点云特征学习,并命名为PointCNN。

u012901740的博客 2300

C#基础2——③方法的重载,out返回值,ref返回值

方法 一、导图 二、方法的重载 static void Main(string[] args) { AddNumber(1,2);//只打半个括号,可以看到,总共显示3个方法,依据每一个方法里的变量类型不同,输入对应的数值 } //返回值类型为int,参数的个数为2,参数类型都为int类型 public static int AddNumber(int num1, int num2) { r...

Jessie_lxr 755

DRM遇到的实际问题及领悟(3)

DRM遇到的实际问题及领悟(3)

phmatthaus的专栏 636

C# ref,in和out使用方法

区别:in无法修改变量的值,ref在调用方法前必须进行赋值,在方法中也可以修改值(有进有出)in关键字同样时把值类型转换为引用类型传递参数的地址,和out区别在于,i。out修饰:在方法中必须赋值,在调用前可以不用赋值,(只出不进.)共同点:将值类型转换为引用类型(按照地址传值)out关键字修饰的参数,在方法中必须进行赋值。n必须在主函数中进行赋值,在方法中不能赋值。

2401_82426642的博客 636

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C#总结---方法的out参数和ref参数

我们知道,在c#中,当我们在一个方法中想要访问另一个方法中的变量的时候,有两种解决方案---参数和返回值。但当需要返回多个值,并且是不同类型的值的之后应该怎么办呢?解决方案可以是 (1)将所有类型数据转换成字符串类型,到最后再都转换回来,这样就比较麻烦了 (2)利用方法的out参数和ref参数 下面要跟大家介绍的就是第二个简单的方法:方法的out和ref参数 在讲解方法的out和ref参数...

灵活的小胖子 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【C#】方法参数的修饰符ref 与 out

方法参数的修饰符 ref 与 out

weixin_44939430的博客 1258

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C#的方法参数-Params,Ref,Out

C#的方法参数C#的方法参数有三个:1.         Params2.         Ref3.         OutParams方法参数,在参数数目可变的参数用的。注意:用Params方法参数的方法中,只允许出现一个参数。Eg:using System; public class MyClass { Public  static  void U

lover_zhuj的专栏 1009

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

摘要:C#中的ref、out和in关键字用于控制方法参数传递方式。ref允许方法修改调用者的初始化变量(双向传递);out强制方法为未初始化的变量赋值(单向输出);in传递只读引用以提高大值类型的性能(单向输入)。三者的主要区别在于变量初始化要求、数据流向和修改权限。ref适合修改变量,out用于返回多个结果,in用于只读访问。合理使用这些关键字可提升代码灵活性和性能,但需注意方法重载限制和兼容性问题。

weixin_66547608的博客 1510

C# 中的 ref 和 out 的意义和使用方法

向方法传递一个实参时,对应的形参会用实参的一个副本来初始化,不管形参是值类型(例如 int),可空类型(int?),还是引用类型,这一点都是成立的。也就是随便在方法内部进行什么修改,都不会影响实参的值。例如,对于引用类型,方法的改变,只是会改变引用的数据,但实参本身并没有变化,它

转角撞倒猪 1052

C# 方法的out、ref、params参数

一、out参数实例 【实例】求一个数组中的最大值、最小值、总和、平均值 class Program { static void Main(string[] args) { //写一个方法 求一个数组中的最大值、最小值、总和、平均值 int[] nums = { 1, 2, 3, 4, 5, 6 ,7}; int max; int sum; ...

Globalizationa的博客 471

C#学习7(方法、out、ref、方法重载、params、递归)

1、方法(函数) 语法: [public] static 返回值类型 方法名([参数列表]) { 方法体; } public:访问修饰符,公开的,公共的 static:表示静态 返回值类型:如果没有返回值,写void 方法名:Pascal,要求每个单词的首字母都要大写。 参数列表:完成这个方法,所必须要提供给这个方法的条件。哪怕方法中不需要参数, 小括号也不能省略。 2.方法的调用: 类名.方法...

野狼的博客 458

C#中方法参数 ref 与 out 的区别

方法中参数的类型有三种 in型参数 in型参数通过值传递的方式将数值传入方法中。即我们在Java中常见的方法 ref型参数 该种类型的参数传递变量地址给方法(引用传递),传递前变量必须初始化。 该类型与out型的区别在与: 1).ref型传递变量前,变量必须初始化,否则编译器会报错,而out型则不需要初始化 2).ref型传递变量,数值可以传入方法中,而out型无法将数据传入方法中。换而言

jl1134069094的博客 3370

C# 方法中的 引用参数 ref out 的使用

应用于参数声明,以按引用而不是按值传递参数: ref:在调用方法之前必须初始化参数。 该方法可以将新值赋给参数,但不需要这样做。 out:该调用方法在调用方法之前不需要初始化参数。 该方法必须向参数赋值。

weixin_44909642的博客 561

C# 中方法参数中params ,ref,out 方法的使用

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace RefAndOutAndParams { class Program { /// <summary> /// 一个方法中可...

weixin_30416497的博客 107

C# 方法中的out、ref和params关键字

out参数 如果你在一个方法中,返回多个相同类型的值的时候,可以考虑返回一个数组。 但是,如果返回多个不同类型的值的时候,返回数组就不行了,那么这个时候, 我们可以考虑使用out参数。 out参数就侧重于在–个方法中可以返回多个不同类型的值。 例: 写一个方法要求返回一个数组包含最大值、最小值、总和、平均值 普通方法: public static int[] GetMaxMinSumAvg(int[] nums) { int[] res = new int[4]; res[0] = nu

u011402129的博客 249
上一篇: 接口转换
下一篇: 浅析C#中new、override、virtual关键字的区别
jackeyabc
博客等级 码龄20年 71粉丝 297原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值