從最簡單的,我們用個例子來傳個參數

static void Main()
{
     int originalNumber = 1;
     addOne(originalNumber);
}

static void addOne(int number)
{
     Console.WriteLine(number + 1);
}

從上面的例子可以看到,Main()裡定義了一個originalNumber的整數並賦值1,接著呼叫addOne()方法,並將originalNumber一併傳送過去.

接著下面的addOne()方法,有定義了一個int number來承接傳送過來的originalNumber,這裡可以看到originalNumber和number是不同的變數名,如果需要你也可以取一樣的變數名,並不影響運作.

而在addOne中的運作,統統使用number這個變數名,它的底層運作其實是將originalNumber的值複製後,另外開了一塊記憶體區塊叫number,再將值複製進去.

所以originalNumber和number是完全不相關的,你將number+1並不會改變originalNumber的值,可以由下面的例子印證.

static void Main()
{
    int originalNumber = 1;
    addOne(originalNumber);
    Console.WriteLine("originalNumber is {0}", originalNumber);
}

static void addOne(int number)
{
    number = number + 1;
    Console.WriteLine("number is {0}", number);
}

結果如下

number is 2
originalNumber is 1

那講到這邊了,我們就要提一下ref這個關鍵字,加上關鍵字代表你傳遞參數時,不是要傳他的值,而是要傳存放記憶體的位址,什麼意思呢??

就是我要把originalNumber和number綁在一起,修改其中一個,另一個就會跟著變動(應該講其實是同一個,但有二個變數名,類似蔣中正和蔣介石是同一個人,蔣中正死了,蔣介石自然也死了)

那我們看一下加了ref的例子

static void Main()
{
    int originalNumber = 1;
    addOne(ref originalNumber);
    Console.WriteLine("originalNumber is {0}", originalNumber);
}

static void addOne(ref int number)
{
    number = number + 1;
    Console.WriteLine("number is {0}", number);
}

結果如下

number is 2
originalNumber is 2

傳送參數時,加上了ref,改動number的值時,連帶originalNumber的值也變了,表示二個指向同一個儲存位址.

那另外一個常用的關鍵字out,它的用法也是傳址,但和ref不同的是,承接out參數的方法,不會讀取參數值,只會寫入.

所以你在呼叫方法時帶入這個out參數不必給定預設值,例子如下

static void Main()
{
    int originalNumber;
    addOne(out originalNumber);
    Console.WriteLine("originalNumber is {0}", originalNumber);
}

static void addOne(out int number)
{
    number = 1;
    number = number + 1;
    Console.WriteLine("number is {0}", number);
}

結果如下

number is 2
originalNumber is 2

上例中,Main()只宣告originalNumber,但並未給定預設值,就直接加上out傳給了addOne(),但最後二個相異的變數名,值是相同的.

最後,我們來說說params這個關鍵字怎麼用,先看下面的例子

static void Main()
{
    int originalNumber = 1;
    addOne(originalNumber, 2, 5, 10);
    Console.WriteLine("originalNumber is {0}", originalNumber);
    Console.ReadKey();
}

static void addOne(int number, params int[] addList)
{
    foreach(int addListItem in addList)
    {
        number = number + addListItem;
    }
    Console.WriteLine("number is {0}", number);
}

結果如下

number is 18
originalNumber is 1

這次傳送給addOne()的參數除了originalNumber外,還多加了三個數字

另外在addOne()準備要承接卻只有二個,除了number承接originalNumber,其他的三個數字全部被放到addList的陣列裡了.

所以params的用法是承接指定之外的所有參數,所以它的用法有一些規定

1. 你必須要把明確的參數放在前面,params必須放在所有參數的最後一個

2. 只能有一個params,你不能同時用static void addOne(int number, params int[] addList, params string[] addList2)

 

 

以上內容是個人的參數傳遞的用法整理及簡單的例子

 

 

 

arrow
arrow

    痞客興 發表在 痞客邦 留言(0) 人氣()