形参与实参
形参:全称为“形式参数”,是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。
实参:全称为"实际参数",是在调用时传递给函数的参数,即传递给被调用函数的值,实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,当代码调用一个方法时,形参的值必须在方法的代码开始执行之前被初始化,用于初始化形参的表达式或变量称作为实参。
初学者也可以简单理解为:
定义方法时在方法后面()中传入的参数为形参,
调用方法时在方法后面()中传入的参数为实参。
params参数
当方法中传入的值的数目不确定时,会使用params参数。params参数用来指定在参数数目可变时采用的方法参数,params参数必须是一维数组。
下面是用params参数实现的多数相加:
public int Add(params int [] x)
{
int sum = 0;
for (int i = 0; i < x.Length; i++)
{
sum += x[i];
}
return sum;
}
static void Main(string[] args)
{
Program a = new Program();
Console.WriteLine(a.Add(1,2));
Console.WriteLine(a.Add(1,2,3,4));
}
需要注意的是,params参数必须是形参列表中的最后一位元素。
public int GetStudent(string name ,float score ,params int [] id)
ref参数
ref参数使方法参数按引用传递,具体作用:当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。(ref关键字必须声明与调用时都显式使用)
假如我们要交换两个数的值:
public void ExchangeNum(int a,int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
static void Main(string[] args)
{
int a = 1, b = 2;
Program A = new Program();
A.ExchangeNum(a, b);
Console.WriteLine("交换后为:{0}和{1}",a,b);
}
输出结果为:交换后为:1和2
显然这不是我们预想的结果,这个问题我的解释是:代码中int是值类型,所创建的实例不在托管堆中分配内存地址,我们通过方法函数只不过是将数据复制过来,即调用ExchangNum()方法并不影响Main()函数中a和b的值,哪怕把它们复制出来的a和b在ExchangNum()方法中完成了赋值,但是在方法调用完后原来a和b的值还是不变。
至此,我们的需求清晰了:我们需要变量作为参数传给方法,同时希望在方法执行完成后,对参数所做的修改能够反映到变量上
那么我们如何正确的交换两数的值呢?ref参数可以实现:
public void ExchangeNum(ref int a,ref int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
static void Main(string[] args)
{
int a = 1, b = 2;
Program A = new Program();
A.ExchangeNum(ref a,ref b);
Console.WriteLine("交换后为:{0}和{1}", a, b);
}
输出结果为:交换后为:2和1
交换成功,因为ref参数修饰变量的传递方式是引用传递,是对参数的地址进行改变,直接能够对原数进行操作,而不是对原数的那个Copy值进行操作。
ref参数的注意事项:
1.ref参数在调用前,必须为其赋值(初始化);
2.其实参只能是变量,不能是常量或者表达式;
3.ref关键字只对紧跟它后面的参数有效,而非应用于整个参数列表;
4.调用方法时,必须使用ref修饰实参,而且因为是引用参数,所以实参和形参的数据类型必须完全匹配;
out参数
out关键字用来定义输出参数,它会导致参数按引用传递,与ref关键字类似,与ref区别在于ref要求变量必须在传递之前初始化,out不用(ref关键字必须声明与调用时都显式使用)
假如我们想在方法中使用未初始化的变量:
public void Add(int a,int b,int c)
{
c = a + b;
}
static void Main(string[] args)
{
int a = 1, b = 2;
int c;
Program A = new Program();
A.Add(a,b,c);
Console.WriteLine(c);
}
输出结果如我们所料报错:使用了未赋值的局部变量“c”,但是添加了out关键字后:
public void Add(int a,int b,out int c)
{
c = a + b;
}
static void Main(string[] args)
{
int a = 1, b = 2;
int c;
Program A = new Program();
A.Add(a,b,out c);
Console.WriteLine(c);
}
输出结果为:3
假如我们想在方法中返回多个值:
public void Student(out int id,out string name,out double score)
{
id = 1;
name = "牛马";
score = 96.5;
}
static void Main(string[] args)
{
int id = 2;
string name ="null";
double score =0;
Program A = new Program();
A.Student(out id,out name,out score);
Console.WriteLine(id);
Console.WriteLine(name);
Console.WriteLine(score);
}
输出结果为:1 牛马 96.5
out参数的注意事项:
1.out参数在调用前可以不赋值(初始化);
2.使用out关键字,可以同时返回多个值;
3.其实参只能是变量,不能是常量或者表达式;
4.out关键字只对紧跟它后面的参数有效,而非应用于整个参数列表;
5.调用方法时,必须使用out修饰实参,而且因为是引用参数,所以实参和形参的数据类型必须完全匹配;
976

被折叠的 条评论
为什么被折叠?



