C#参数传递
1·值类型参数传递
- 关键字:out,ref
- 意义:参数传递的方向
//值类型值传递
public void Add1(int a)
{
//直接将变量a的值带入方法中
a=10;
Console.WritrLine(a);
}
//值类型引用传递
public void Add2(ref int a)
{
//会将变量a的值带入方法中,又会改写a
a=10;//会改变对应实参的值
Console.WritrLine(a);
}
public void Add3(out int a)
{
//不会将a的值带入,但是会改写
a=10;//必须在方法内给a赋值
Console.WritrLine(a);
}
调用:b=5;
Add1(b);//b=5,输出10
Add2(ref b);//b=10,输出10
Add3(out b);//b=10,输出10
- ref 与 out:
- 二者都是取到实参的地址,对实参进行操作
- ref会引进实参的值,也可以修改实参的值
- out不引进实参的值,需要在方法体内为参数赋值,会改变实参的值
2·引用类型参数传递
- 使用out的情况下,必须需要给参数初始化:p=new Person();然后对p的属性赋值,改变实参指向的对象
- 使用值传递或ref传递时:
- 若方法体中没有对引用类型初始化,二者效果相同,且都可以改变对应实参的属性值
- 若方法体中有对引用类型初始化:
- 值传递对参数对象的属性值修改只生效与方法范围内
- 引用传递对参数对象的属性值修改会改变实参的属性值(将初始化产生的新对象地址给了实参,此时实参拿到的是方法中初始化产生的新对象)
- 对于引用类型,无论是值传递还是引用传递,在方法内部对于对象的修改都是有效的,参数传递重点讨论的是,栈中变量的值是何种传递方式
3·params关键字
-加在一个数组前,批量传入同类型参数,编译器自动将接受到的参数转入一个参数数组,方法使用的是参数数组,省略了定义数组的过程
public void Add(int a,params int[] array)
{
Console.WriteLine(a);
Console.WriteLine(array.Length);
}
调用:Add(1,2,3,4,9,6,4);//a=1,array[]={2,3,4,9,6,4}
- params只能用于修饰最后一个参数,且参数类型是一个数组,否则会吞掉其他参数
4·扩展方法
- 类型转换
- 例int.parse(“123”)只能将字符串转为对应类型
- int a=Convert.Toint32(“123”)可以任何类型互转
- 扩展方法:无侵入式开发
- 不改变原类的成员结构和代码
- 为原类添加可用成员
- 重点:
- 必须是静态类的静态方法
- 参数列表(this 要扩展的类型 类型对象),可以用逗号添加其他参数
例
public static class StringExtend
{
public static int Toint32(this string str)
{
return int.Parse(str);
}
}
调用:int a=str1.Toint32();