ref out params参数修饰符
params
使用params修饰形参,可以允许调用函数传参时:1.无参 2.逗号分隔的多个参数 3.值为数组的变量ref与out基本用法
使用时在实参和形参前添加ref或者out修饰符,用于对实参的值进行修改。ref与out的区别
- 使用ref前,变量必须先初始化
- 必须对out修饰的形参进行赋值
- 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.
- 作用
- 减少在传参过程中的拷贝开销。
- 简洁代码,提高开发效率。
- 某些情况可以减少装箱拆箱操作带来的消耗