前言
不管是值类型还是引用类型,你都可以使用ref或者out关键字
来实现参数的按引用传递。并且在按照引用类型进行传递时候,方法
的定义和调用必须显式的使用ref或者out关键字,不可以将它们省略,否则引起编译错误
在按照引用传递时,不管参数是值类型还是引用类型,本质都
是一样的,都是通过ref或者out告诉编译器,方法传递的是参数地址,
而非参数本身。
参数传递种类
值传递:传递实参的拷贝,既然是拷贝那么在函数中对这个形参所作的任何动作都不会反应到原来的实参中。
引用传递:传递实参的地址(形参和实参指向同一块内存地址),那么在函数中对形参所作的任何改变都要反映到原来的实参中。
ref修饰符
表示引用的方式传递参数,实参和形参引用的都是同一个对象,改变其中的一个引用值,另一个也会改变。
传递前必须初始化,
ref修饰符在写函数和调用函数时一定要出现
public class B {
public void Print(ref int a) {
a = 20;
Console.WriteLine(a);
}
}
主函数调用
int x = 14;
B b = new B();
b.Print(ref x);
主要应用于实现交换的方法
public class C {
public void Print(ref string s, ref string s1) {
string swap = s;
s = s1;
s1 = swap;
}
}
主函数调用
string a = “hello”;
string b = “world”;
C c = new C();
c.Print(ref a,ref b);
Console.WriteLine(a);
Console.WriteLine(b);
Out修饰符
传递到方法体后,参数被清空
值必须在方法体内赋值
返回前值必须初始化,传递前可以不初始化
在调用函数时不需要赋值
在函数退出前必须赋值
public void Per(out int x) {
x = 100;
}
主函数:
int x;
c.Per(out x);
Console.WriteLine(x);
可变参数
使用params关键字,并且可变参数只能是所有参数的最后一个,即params修饰的参数必须在后面,参数类型必须一致。
个数不确定的可变参数以数组的形式传递。
public void Foo(params object[] list) {
foreach (object o in list) {
if (o.GetType() == typeof(int))
{
Console.WriteLine(o);
}
else if (o.GetType() == typeof(string))
{
Console.WriteLine(o);
}
else {
}
}