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