形参和实参
- 形参:int sum(int num1,int num2) ,num1和num2为形参,在函数定义中出现的参数可以看做一个占位符,它没有数据,只有在函数被调用时才会分配内存,调用结束后,立刻释放内存。所以形参只有在函数内部有效,不能在函数外部使用。
- 实参:函数被调用时给出的实实在在的数据,会被函数内部的代码使用。int a=5,int b=10; int c=sum(a,b);这里的a和b是实参。
- 区别和联系:函数调用时发生的数据传递是单向的,只能把实参的值传递给形参,形参值得改变并不会影响实参的值。
参数传递
方式 | 描述 |
值参数 | 这种方式复制参数的实际值给函数的形式参数,实参和形参使用的是两个不同内存中的值。在这种情况下,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。 |
引用参数 | 这种方式复制参数的内存位置的引用给形式参数。这意味着,当形参的值发生改变时,同时也改变实参的值。 |
输出参数 | 这种方式可以返回多个值。 |
- 按照引用传递参数
引用参数表示与提供给方法的实际参数具有相同的内存位置。在c#中使用ref关键字声明引用参数。所以在函数内对参数进行改变,实际参数的值也会发生改变。
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public void swap(ref int x, ref int y)
{
int temp;
temp = x; /* 保存 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 temp 赋值给 y */
}
static void Main(string[] args)
{
NumberManipulator n = new NumberManipulator();
/* 局部变量定义 */
int a = 100;
int b = 200;
Console.WriteLine("在交换之前,a 的值: {0}", a);
Console.WriteLine("在交换之前,b 的值: {0}", b);
/* 调用函数来交换值 */
n.swap(ref a, ref b);
Console.WriteLine("在交换之后,a 的值: {0}", a);
Console.WriteLine("在交换之后,b 的值: {0}", b);
Console.ReadLine();
}
}
}
//结果是将ab值进行交换
- 按输出传递参数
输出参数会把方法输出的数据赋给自己,其他方面与引用参数相似。
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public void getValue(out int x )
{
int temp = 5;
x = temp;
}
static void Main(string[] args)
{
NumberManipulator n = new NumberManipulator();
/* 局部变量定义 */
int a = 100;
Console.WriteLine("在方法调用之前,a 的值: {0}", a);
/* 调用函数来获取值 */
n.getValue(out a);
Console.WriteLine("在方法调用之后,a 的值: {0}", a);
Console.ReadLine();
}
}
}//结果是:a的值被修改为5
- ref和out区别 :
ref:传进去的参数必须在调用前进行初始化。传入的值可以直接在函数内部使用,比如int temp=x(这样会报错);ref传入的参数值在函数内部可以不被修改。
out:传进去的参数不用在调用前进行初始化。传入的值不可以直接在函数内部使用,比如int temp=x;一定要在函数内赋一个值给参数(或者说函数承担初始化这个变量的责任)。