ref、out和params

值传递和引用传递

形参:方法定义处定义的参数

实参:方法调用时提供的参数

 

值传递:方法传递值,值传递实参和形参都会在栈中占用内存,相互之间并不影响,而是形参限制了实参的类型,

形参作为临时变量在调用结束后即销毁。

 

引用传递:方法传递引用,引用传递实参和形参在堆中占用同一块内存,形参的改变会影响实参的值。

 

例子:

 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);
View Code

变量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);
View Code

例子中有两处错误:

1 ref参数j在方法调用前未赋值

2 out参数在方法中为赋值

 

params 可选参数

定义形式:params + 数组

位置:在所有参数之后且唯一

传参形式:数组或用逗号隔开,参数可以零个或多个

 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 });
View Code

 

posted @ 2020-12-24 17:04  htiu  阅读(94)  评论(0编辑  收藏  举报