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

方法中参数的类型有三种

  1. in型参数
    in型参数通过值传递的方式将数值传入方法中。即我们在Java中常见的方法

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

  3. out型参数
    与ref型类似,仅用于传回结果。
    注意:
    1). out型数据在方法中必须要赋值,否则编译器会报错。
    eg:如下图若将代码中的sum1方法的方法体
    改为 a+=b;则编译器会报错。原因:out型只出不进,在没给a赋值前是不能使用的
    改为 b+=b+2;编译器也会报错。原因:out型数据在方法中必须要赋值。
    2). 重载方法时若两个方法的区别仅限于一个参数类型为ref 另一个方法中为out,编译器会报错
    eg:如下图若将代码中
    方法名sum1 改为sum(或者将方法名sum改为sum1),编译器会报错。
    Error 1 Cannot define overloaded method ‘sum’ because it differs from another method only on ref and out
    原因:参数类型区别仅限于 为ref 与为out 时,若重载对编译器而言两者的元数据表示完全相同。

具体区别见代码

class C
    {
        //1. in型参数
        public void sum(int a, int b) {
            a += b;
        }
        //2. ref型参数
        public void sum(ref int a, int b)
        {
            a += b;
        }
        //3. out型参数
        public void sum1(out int a, int b)
        {
            a = b+2;
        }
        public static void Main(string[] args)
        {
            C c = new C();
            int a = 1, b = 2;
            c.sum(a,b);
            Console.WriteLine("a:{0}", a);
            a = 1; b = 2;
            c.sum(ref a, b);
            Console.WriteLine("ref a:{0}", a);
            a = 1; b = 2;
            c.sum1(out a, b);
            Console.WriteLine("out a:{0}", a);
        }
    }

输出结果:
输出结果
从代码也可以看出,in型参数为值传递,所以当将变量a传入方法时,变量a的值并不会发生变化。而ref型参数,由于是引用传递,将变量的值和地址都传入方法中故变量值改变。out型无法将变量的值传入。但可以将变量的地址传入并为该地址上的变量赋值。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值