首页 > 编程语言 >C# ref关键字和out关键字

C# ref关键字和out关键字

时间:2023-05-10 10:44:45浏览次数:38  
标签:val C# ref 44 关键字 方法 out

1.ref关键字    

    我们知道C#语言的数据类型分为值类型和引用类型,其中它们最典型的差别就是在作为方法的参数方面。值类型数据作为参数,修改形参时不会影响到实参;而引用类型数据作为参数,修改形参可以影响到实参。

    但是某些情况下,传递的是值类型数据,却要求把修改的结果带回来,像引用类型作为参数那样的效果,怎么办?在C#语言中,ref关键字就可以达到这样的效果。ref关键字使实参按引用类型传递,其效果是,当控制权传递回调用方法时,在方法中对形参的任何更改都将反映在该实参中。下面来看一个例子:

    //定义一个ref形参的方法

    static void  Method(ref int i)

    {

        i  =  44;

    }

    //在Main方法中调用上面定义的ref形参方法

    static void Main(string[] args)

    {

        int val = 0;

       Method(ref val); //执行完方法,变量val的值是44

       Console.WriteLine("val值是:" + val.ToString());   //此时输出结果是: “val值是:44”

    }

 

    ref关键字使整型变量val按照引用类型方式传递给Method方法,在Method方法中把参数 i 修改成了 44 ,因为是按引用传递,所以这时变量val的值就变成了 44 。同时要注意的是,若要使用ref参数,则方法定义和调用方法都必须显式使用ref关键字。

 

2.out关键字

    out关键字和ref关键字非常相似,都会导致参数按照引用方式传递。下面的示例演示了out关键字的方法:

    //定义一个out形参的方法

    static void  Method(out int i)

    {

        i  =  44;

    }

    //在Main方法中调用上面定义的out形参方法

    static void Main(string[] args)

    {

        int val;

       Method(out val); //执行完方法,变量val的值是44

       Console.WriteLine("val值是:" + val.ToString());   //此时输出结果是: “val值是:44”

    }

    需要说明的是,若要使用out参数,方法定义和调用方法都必须显式使用out关键字。大家感觉和ref关键字一模一样,都是把实参按照引用类型方式传递,都需要在方法定义和调用方法时使用关键字。但是他们有一个非常重要的区别,仔细对比ref的示例和out的示例就会发现,ref的示例中变量val在调用方法前赋值了,而out示例中变量val在调用方法之前没有赋值。这就是它们语法上的区别,传递到ref的参数必须最先初始化。而out则不同,out的参数在传递之前不需要初始化。

    还有一点需要说明,尽管作为out参数传递的变量不必在传递之前进行初始化,但需要调用方法在方法返回之前赋值。也就是说,上面示例中的Method方法必须在执行完以前对变量 i 进行赋值。

    两个关键字语法相似,这里对ref和out进行一个总结,ref关键字重在修改参数的数据,而out关键字重在带回执行结果。

标签:val,C#,ref,44,关键字,方法,out
From: https://www.cnblogs.com/YDSLM/p/17387252.html

相关文章

  • C# .Net Core 合并PDF文件
    使用PdfSharpCorenuget包代码实现usingMicrosoft.AspNetCore.Razor.TagHelpers;usingPdfSharpCore.Pdf;usingPdfSharpCore.Pdf.IO;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespace......
  • QA|Pycharm中的git分支提交冲突问题和解决|GIT
    前天,Pycharm中的git分支提交冲突了,原因是我PC上改了文件没有提交,笔记本又本地改代码,笔记本提交时就出现报错:提交拒绝,但pull也被拒绝,网上试了rebase等方法,均没得到解决,最终自己尝试找到了解决办法:现象: 解决:选中分支按照图中操作注意:记得提前备份本地代码接下来就可以了 ......
  • arcpy遍历数据随记
    arcpy.da.SearchCursor和arcpy.SearchCursor的区别两者的都可以实现查询及遍历arcpy.da.SearchCursor:witharcpy.da.SearchCursor("GXB","*",sql_clause=(None,"Orderbyhbm"))ascursor:witharcpy.da.SearchCursor("Schools.shp",("......
  • chatgpt帮我创建一个由go+mysql+jwt+gorm搭建的restapi
    好的,下面是一个简单的由go+mysql+jwt+gorm搭建的RESTAPI示例:首先,你需要创建一个新的Go模块。你可以使用如下命令来创建一个名为example的新模块:gomodinitexample接下来,你需要安装需要的依赖库,使用以下命令进行安装:gogetgithub.com/gorilla/muxgogetgithub.com/jinzhu......
  • CH57x/CH58x原理图与PCB绘制
    前言针对供电系统、天线系统、下载以及出现问题进行汇总。一、供电系统1、供电以CH582M举例(其他见芯片手册的第二十参数章节),芯片可供供电范围[2.3-3.6],一般给到芯片引脚(VIO33/VDD33)的供电典型值为3.3V,只需要给该引脚供电,其他引脚均不需要供电。2、内部电路内部电路注意VSW/......
  • Echarts引入——绘制一个简单的图表
    获取EChartsNPM安装EChartsnpminstallecharts--save引入EChartsimport*asechartsfrom'echarts';//基于准备好的dom,初始化echarts实例varmyChart=echarts.init(document.getElementById('main'));//绘制图表myChart.setOption({title:{text......
  • Induction_Motor_VF_Control:基于MATLAB/Simulink的利用V/F控制的感应电机调速仿真模型
    Induction_Motor_VF_Control:基于MATLAB/Simulink的利用V/F控制的感应电机调速仿真模型。仿真条件:MATLAB/SimulinkR2015bID:8460650374052032......
  • 解决webgl使用canvas.toDataURL()没有内容的问题
    这个问题很好解决,就是在获取webgl对象的时候,多传入一个​​{preserveDrawingBuffer:true}​​​,然后在使用​​canvas.toDataURL()​​​获取就能够获取到了。案例:varcanvas=document.getElementById("canvas");vargl=canvas.getContext("webgl",{preserveDrawingBuf......
  • DC_Machine_Armature_Control:基于MATLAB/Simulink的直流电机电枢闭环控制系统仿真模型
    DC_Machine_Armature_Control:基于MATLAB/Simulink的直流电机电枢闭环控制系统仿真模型。仿真条件:MATLAB/SimulinkR2015bID:6840650770413102......
  • C#-Linq
    linq可以对多种数据源和对象进行查询,如数据库、数据集、XML文档、数组等。通过对linq的使用,可以减少代码量并优化检索操作。LINQ关键字from指定数据源和范围变量where根据布尔表达式(由逻辑与或等组成)从数据源中筛选元素select指定查询结果中的元素所具有的类型或表......