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

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

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

代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;  

    namespace ref_out
    {
        class Program
        {
            static void Main(string[] args)
            {
                int i = 8;
                Console.WriteLine(i);
                DoIncrease(i);
                Console.WriteLine(i);
            }  

            static void DoIncrease(int a)
            {
                a++;
            }
        }
    }

运行结果如下:

若使用 ref 关键字,向形参应用的任何操作都同样应用于实参,因为形参和实参引用的是同一个对象。

  PS:实参和形参都必须附加 ref 关键字做为前缀。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;  

    namespace ref_out
    {
        class Program
        {
            static void Main(string[] args)
            {
                int i = 8;
                Console.WriteLine(i);   // 8
                DoIncrease(ref i);      // 实参前也必须加 ref
                Console.WriteLine(i);   // 9 // ref 关键字使对形参的动作也应用于实参
            }  

            static void DoIncrease(ref int a)   // 形参前必须加 ref
            {
                a++;
            }
        }
    }

运行结果如下

ref 实参使用前也必须初始化,否则不能通过编译。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;  

    namespace ref_out
    {
        class Program
        {
            static void Main(string[] args)
            {
                int i;          // ref 实参没有初始化,所以程序不能通过编译
                Console.WriteLine(i);
                DoIncrease(ref i);
                Console.WriteLine(i);
            }  

            static void DoIncrease(ref int a)
            {
                a++;
            }
        }
    }

有时我们希望由方法本身来初始化参数,这时可以使用 out 参数

代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;  

    namespace ref_out
    {
        class Program
        {
            static void Main(string[] args)
            {
                int i;    // 没有初始化
                //Console.WriteLine(i); // 此处 i 未初始化,编译错误
                DoIncrease(out i);  // 用方法来给实参赋初值
                Console.WriteLine(i);
            }  

            static void DoIncrease(out int a)
            {
                a = 8;  // 在方法中进行初始化
                a++;    // a = 9
            }
        }
    }

时间: 2024-08-25 12:20:54

C# 中的 ref 和 out 的意义和使用方法的相关文章

在typeScript+vue项目中使用ref

因为vue项目是无法直接操作dom的,但是有时候开发需求迫使我们去操作dom. 两个办法,一个是很low的再引入jq,然后通过jq来操作,但是这样就失去了我们使用vue的意义, 可惜的是我曾经这样干过,而且当时觉得我就是个天才. 另一个就是添加ref属性,对ref进行操作. 好了完美解决. 很不巧,新项目用的是vue还是vue+typeScript的,直接,单纯的this.$refs.xxx不好用了,报错,识别不了,很尴尬. 经过不懈努力终于找到了在typeScript+vue(不要在意这两个前

关于JavaScript中apply与call的用法意义及区别(转)

JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别.先来看看JS手册中对call的解释: call 方法调用一个对象的一个方法,以另一个对象替换当前对象.call([thisObj[,arg1[, arg2[,   [,.argN]]]]])参数thisObj可选项.将被用作当前对象的对象.arg1, arg2,  , argN可选项.将被传递方法参数序列.说明call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下

C#方法中的ref和out

ref        通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不将受到影响.此外我们还有其他向方法传递参数的形式,引用(ref)和输出(out).    有时,我们需要改变原来变量中的值,这时,我们可以向方法传递变量的引用,而不是变量的值.引用是一个变量,他可以访问原来变量的值,修改引用将修改原来变量的值.变量的值存储在内存中,可以创建一个引用,他指向变量在内存中的位置.当引用被修改时,修改的是内存中的值,因此变量

C#中关键字ref与out的区别(转)

在C#中,ref与out是很特殊的两个关键字.使用它们,可以使参数按照引用来传递. 总的来说,通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不将受到影响.此外我们还有其他向方法传递参数的形式,引用(ref)和输出(out). 有时,我们需要改变原来变量中的值,这时,我们可以向方法传递变量的引用,而不是变量的值.引用是一个变量,他可以访问原来变量的值,修改引用将修改原来变量的值.变量的值存储在内存中,可以创建一个引用,他指

C#中使用ref 和 out 的一点认识

ref 通常我们向方法中传递的是值,方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不会受到影响. 这种情况是通常的,当然还有另外一种情况,我们向方法传递参数的形式,引用(ref)和输出(out). 有时,我们需要改变原来变量中的值,这是我们可以向方法传递变量引用,而不是变量的值,引用是一个变量,他可以访问原来变量的值,修改引用将修改原来变量的值.变量的值存储在内存中,可以创建一个引用,他指向变量在内存中的位置,当引用被修改时,修改的是内存中的值,因

c语言中的数组名代表的意义

数组名是数组的首地址,就是数组中的第一个元素的地址,是常量.常量是不能值在=的左边的.数组和指针的区别在于,指针是变量,是用来存储指向数据的地址的变量,而数组名是常量.一般情况下申明一个数组,比如char  a[10]; 之后  数组名a都是数组的首地址,是一个地址常量.但是在函数申明的形参列表中除外,比如: int  fo(char []); 在这种情况下的申明与 int  fo(char a[]); int  fo(char *a); 是等价的,就是说在这种情况下,就算你写的是数组的形式,编

转载:onCreate()方法中的参数Bundle savedInstanceState 的意义用法

Activity中有一个名称叫onCreate的方法.该方法是在Activity创建时被系统调用,是一个Activity生命周期的开始.可是有一点容易被忽视,就是onCreate方法的参数saveInsanceState.一般的程序开发中,很少用到这个参数.       onCreate方法的完整定义如下:      public void onCreate(Bundle saveInsanceState){                super.onCreate(saveInsanceSt

react中的ref的3种方式

2020-03-31 react中ref的3种绑定方式 方式1: string类型绑定 类似于vue中的ref绑定方式,可以通过this.refs.绑定的ref的名字获取到节点dom 注意的是 这种方式已经不被最新版的react推荐使用,有可能会在未来版本中遗弃 方式2: react.CreateRef() 通过在class中使用React.createRef()方法创建一些变量,可以将这些变量绑定到标签的ref中 那么该变量的current则指向绑定的标签dom 方式3: 函数形式 在clas

简单谈一谈php中var关键字的作用和意义

var就是public的别名,是用在类中定义公有属性的,只不过历史问题,现在不用var了. php官方的解释:类属性必须定义为公有,受保护,私有之一,如果使用var定义,则被视为公有. Note: 为了兼容性考虑,在 PHP 4 中使用 var 关键字对变量进行定义的方法在 PHP 5 中仍然有效(只是作为 public 关键字的一个别名). 在 PHP 5.1.3 之前的版本,该语法会产生一个 E_STRICT 警告