值传递和引用传递
形参:方法定义处定义的参数
实参:方法调用时提供的参数
值传递:方法传递值,值传递实参和形参都会在栈中占用内存,相互之间并不影响,而是形参限制了实参的类型,形参作为临时变量在调用结束后即销毁。
引用传递:方法传递引用,引用传递实参和形参在堆中占用同一块内存,形参的改变会影响实参的值。
例子:
public static bool Test(int i,string s)
{
i = i + 2;
s = (i + 5).ToString();
return i < Convert.ToInt32(s);
}
static void Main(string[] args)
{
int j = 1;
string S = "10";
Test(j, S);
变量i是值传递,是形参,变量j是实参,i的改变并不会改变j的值
变量s是引用传递,是形参,变量S是实参,s的改变会影响S的值,因为s和S指向同一块内存
ref 和out
代码例子
public static bool Test(ref int i,out string s)
{
i = i + 2;
//s = (i + 5).ToString();
return i < Convert.ToInt32(s);
}
static void Main(string[] args)
{
//int j = 1;
int j;
string S = "10";
Test(ref j, out S);
例子中有两处错误:
1 ref参数j在方法调用前未赋值
2 out参数在方法中为赋值
params 可选参数
定义形式:params + 数组
位置:在所有参数之后且唯一
传参形式:数组或用逗号隔开,参数可以零个或多个
public void TestParams(ref int sum,params int [] arr)
{
for (int i = 0; i < arr.Length; i++)
{
sum = sum + arr[i];
}
}
Calc c = new Calc();
c.TestParams(ref sum, 1, 2, 3, 4, 5, 6);
c.TestParams(ref sum, new int[] { 1, 2, 3 });