天天看點

ref、out和params

值傳遞和引用傳遞

形參:方法定義處定義的參數

實參:方法調用時提供的參數

值傳遞:方法傳遞值,值傳遞實參和形參都會在棧中占用記憶體,互相之間并不影響,而是形參限制了實參的類型,形參作為臨時變量在調用結束後即銷毀。

引用傳遞:方法傳遞引用,引用傳遞實參和形參在堆中占用同一塊記憶體,形參的改變會影響實參的值。

例子:

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

ref、out和params

代碼例子

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);
           
ref、out和params

例子中有兩處錯誤:

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