【C#/笔记】参数修饰符Ref Out Params

ref out params参数修饰符

  • params
    使用params修饰形参,可以允许调用函数传参时:1.无参 2.逗号分隔的多个参数 3.值为数组的变量

  • ref与out基本用法
    使用时在实参和形参前添加ref或者out修饰符,用于对实参的值进行修改。

  • ref与out的区别

    1. 使用ref前,变量必须先初始化
    2. 必须对out修饰的形参进行赋值
    3. ref允许不对变量进行赋值更改而out不行

    简单说ref必须由调用方明确赋值,out必须由被调用方为其赋值,其他效果基本相同。

  • 重载误区
    同一函数不可只通过使用ref和out修饰符的不同来进行重载,例如:

    public void SampleMethod(out int i) { }
    public void SampleMethod(ref int i) { }

    但可以通过是否有修饰符来重载,例如:

    public void SampleMethod(int i) { }
    public void SampleMethod(ref int i) { }

  • 属性误区
    属性不是变量,不能以ref或out 修饰传递。

  • 本质
    传递变量的引用而非变量所存储对象的引用。

    public class Character {
    public int hp = 10;
    }
    Character Target = new Character();
    void SetNull(Character _cha) {
    _cha = null;
    }
    Character Target2=Target;
    SetNull(Target2);

    不使用ref或out修饰时,在函数内部对形参重新赋值,并不会影响到作为实参传递的变量的值,如上面的代码,结果形参也相当于是局部变量的_cha为Null,作为实参传入的Target2与Target指向同一个对象实例,值不变。

    void SetNull(out Character _cha) {
    _cha = null;
    }
    Character Target2=Target;
    SetNull(out Target2);

    在原有基础上增加修饰符out(或ref),得到结果,_cha为Null,作为实参传入的Target2不再指向原来的实例而是变为Null,而Target依然指向原来的对象实例,值不变。

    void SetNull(ref Character _cha) {
    _cha.hp = 20;
    }
    Character Target2=Target;
    SetNull(ref Target2);

    在第二种基础上做了一些更改,对_cha所指向对象的成员变量赋值。这里会发现使用out来修饰参数会报错,因为只是更改_cha所指向对象的成员变量的值而没有对_cha进行赋值,所以结果_cha,Target2,Target指向同一个实例,成员变量hp都为20.

  • 作用
    1. 减少在传参过程中的拷贝开销。
    2. 简洁代码,提高开发效率。
    3. 某些情况可以减少装箱拆箱操作带来的消耗
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值