1. 程式人生 > >C#方法的參數 Ref Out Params 4種類型的參數

C#方法的參數 Ref Out Params 4種類型的參數

html 新特性 位置 可用 pub 按值傳遞 title 問題 ref

轉載:http://www.cnblogs.com/kissdodog/archive/2013/05/11/3072815.html

一、按值傳遞參數

  值參數是通過將實參的值復制到形參,來實現按值傳遞到方法,也就是我們通常說的按值傳遞。

  方法被調用時,CLR做如下操作:

  1、在托管堆棧中為形參分配空間;

  2、將實參的值復制到形參。

  這個太常用了,按值傳遞參數,是復制一份,因此不影響原來參數的值。

技術分享
public class Program
    {
        static void Main(string[] args)
        {
            int i = 1;
            int j = 2;
            int k = Plus(i,j);
            Console.WriteLine(i);   //輸出 1
            Console.WriteLine(j);   //輸出 2
            Console.WriteLine(k);   //輸出 5

            Console.ReadKey();
        }

        public static int Plus(int i, int j)
        {
            i = i + 1;
            j = j + 1;
            return i + j;
        }
    }
技術分享

二、按引用傳遞參數 -- 關鍵字ref

  和前面的“按值傳遞”相對應的是按引用傳遞。顧名思義,這裏傳遞的不在是值,而是引用。註意這裏不是傳遞一個復制品了,而是將真實的自己傳到方法中供方法玩弄。

  註意點:

  1、按引用傳遞的參數,系統不再為形參在托管棧中分配新的內存。

  2、此時,形參名其實已經成為實參名的一個別名,它們成對地指向相同的內存位置。

技術分享
    public class Program
    {
        static void Main(string[] args)
        {
            int i = 1;
            int j = 2;
            int k = Plus(ref i,ref j);      //實參前也要加ref關鍵字
            Console.WriteLine(i);   //輸出 2
            Console.WriteLine(j);   //輸出 3
            Console.WriteLine(k);   //輸出 5

            Console.ReadKey();
        }

        public static int Plus(ref int i, ref int j)    //形參錢要加ref關鍵字
        {
            i = i + 1;
            j = j + 1;
            return i + j;
        }
    }
技術分享

  以上例子與上面的幾乎一樣,只是加了4個ref,留意到,在方法中對參數的修改,會對傳方法的參數的值造成影響。

三、輸出參數 - 關鍵字out

  輸出參數和引用參數有一定程度的類似,輸出參數可用於將值從方法內傳遞到方法外,實際上就相當於有多個返回值。要使用輸出參數只需要將引用參數的ref關鍵字替換為out關鍵字即可。但又一點必須註意,只有變量才有資格作為輸出參數,文本值和表達式都不可以,這點要謹記。

  註意兩個問題:

  1、編譯器允許在方法中的任意位置、任意時刻讀取引用參數的值。

  2、編譯器禁止在為輸出參數賦值前讀取它。

  這意味著輸出參數的初始值基本上是沒意義的,因為它在使用前要被賦予新的值。因此想通過輸出參數將值傳入方法的路是行不通的。

技術分享
    public class Program
    {
        static void Main(string[] args)
        {
            int i = 1;
            int j = 2;
            int k = Plus(i,out j);      //實參前也要加out關鍵字
            Console.WriteLine(i);   //輸出 1
            Console.WriteLine(j);   //輸出 100
            Console.WriteLine(k);   //輸出 102

            Console.ReadKey();
        }

        public static int Plus(int i, out int j)
        {
            i = i + 1;
            j = 100;
            return i + j;
        }
    }
技術分享

四、參數數組 - 關鍵字params

  參數數組:

技術分享
public class Program
    {
        static void Main(string[] args)
        {
            int count1 = Plus(1);       //輸出 1
            Console.WriteLine(count1);

            int count2 = Plus(1, 2, 3);//輸出 6
            Console.WriteLine(count2);

            int count3 = Plus();    //輸出 0  參數數組本身可選,沒傳入值也不會出錯
            {
                Console.WriteLine(count3);
            }

            Console.ReadKey();
        }

        public static int Plus(params int[] values)
        {
            int count = 0;
            foreach (int i in values)
            {
                count = count + i;
            }
            return count;
        }
    }
技術分享

  另外再補充兩個C# 4.0的新特性可選參數與命名參數:

  1、可選參數

  可選參數,顧名思義,它不是必需的。對於一般的參數,如果不為它指定值,可能會導出運行出錯。但是可選參數不會。

  可選參數的規則:

  1、可選參數不能為參數列表第一個參數,它必須位於所有必選參數之後;

  2、可選參數必須指定一個默認值;

  3、可選參數的默認值必須是一個常量表達式;

  4、所有可選參數以後的參數都必須是可選參數。

技術分享
public class Program
    {
        static void Main(string[] args)
        {
            int count1 = Plus(5);    //當不指定可選參數時,是默認值
            Console.WriteLine(count1);  //輸出 15

            int count2 = Plus(5,5); //當指定可選參數時,有默認值
            Console.WriteLine(count2);  //輸出 10

            Console.ReadKey();
        }

        public static int Plus(int i, int j = 10)
        {
            return i + j;
        }
    }
技術分享

  2、命名參數

  可選參數解決的是參數默認值的問題,而命名參數解決的是參數順序的問題,命名參數將我們從記憶每個方法數目繁多的參數列表中解放了出來。讓你可以不按順序輸入參數。

技術分享
public class Program
    {
        static void Main(string[] args)
        {
            //string str = "字符串";
            //int i = 10;
            //Console.WriteLine(Plus(str:str,i:i));     //雖然很怪異,但這3行代碼是能正常運行的

            Console.WriteLine(Plus(str:"字符串",i:10));      //註意順序與方法簽名參數中的不一樣

            Console.ReadKey();
        }

        public static string Plus(int i, string str)
        {
            return str + i.ToString();
        }
    }
技術分享

C#方法的參數 Ref Out Params 4種類型的參數