從最簡單的,我們用個例子來傳個參數
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)
以上內容是個人的參數傳遞的用法整理及簡單的例子
留言列表