更新:2007 年 11 月
這個章節將要討論方法以及如何利用傳址 (By Reference) 方式和傳值 (By Value) 方式來傳遞方法參數。
Main () 方法
每一個 C# 應用程式都必須包含單一 Main 方法,此方法指定要從何處開始執行程式。在 C# 中,Main 是大寫,而 Java 則是使用小寫的 main。
Main 只能傳回 int 或 void,而且具有選擇性的字串陣列引數,用來代表命令列參數:
static int Main(string[] args)
{
//...
return 0;
}
這個字串陣列參數包含任何傳入的命令列引數,其運作方式和在 Java 中一樣。因此,args[0] 指定第一個命令列參數、args[1] 則代表第二個參數,以此類推。C# 與 C++ 不同的是,args 陣列並沒有包含 EXE 檔案的名稱。
其他方法
將參數傳遞至方法時,可使用傳值方式或傳址方式來傳遞參數。值參數只帶有要用於方法中的任何變數值。因此,即使對方法中的參數執行動作,也不會影響到位於呼叫程式碼中的變數值。
但是,參考參數會指向在呼叫程式碼中宣告的變數,因此當您以傳址方式傳遞時,方法會修改該變數的內容。
以傳址方式傳遞
不論是在 Java 還是 C# 中,參考至物件的方法參數將永遠以傳址方式傳遞,而基本資料型別的參數 (在 C# 中則為「實值型別」(Value Type) ) 則是以傳值方式傳遞。
在 C# 中,若要以傳址方式傳遞實值型別,您需要指定 ref 或 out 其中一個關鍵字。這兩個關鍵字的差異在參數初始化方面。ref 參數必須在使用前先初始化,而 out 參數則是在傳遞之前或是在先前的值被忽略之前都不需要明確初始化。
ref 關鍵字
當想要讓被呼叫之方法永久地變更做為參數的變數值時,請對實值型別參數指定這個關鍵字。這樣做會傳遞變數本身的參數,而不是傳遞呼叫時所使用的變數值。接著方法會在參考上運作,如此一來,當做方法參數的原始變數將會保存在方法執行期間內對參數所做的變更。
下列程式碼會在 Add 方法中示範這個作業,在程式碼中使用了 ref 關鍵字以傳址方式傳遞第二個 int 參數:
class TestRef
{
private static void Add(int i, ref int result)
{
result += i;
return;
}
static void Main()
{
int total = 20;
System.Console.WriteLine("Original value of 'total': {0}", total);
Add(10, ref total);
System.Console.WriteLine("Value after calling Add(): {0}", total);
}
}
這個簡單範例的輸出說明對結果參數所做的變更,會反映至 Add 呼叫中所使用的變數 total:
Original value of 'total': 20
Value after calling Add(): 30
這是因為,結果參數會參考由呼叫程式碼之 total 變數實際佔用的記憶體位置。類別的屬性並不是變數,因此無法直接當做 ref 參數使用。
當您呼叫方法時以及在方法宣告中,ref 關鍵字必須放在參數之前。
out 關鍵字
out 關鍵字的功用十分類似 ref 關鍵字,您將在方法外部看到針對使用 out 宣告之參數所做的修改。它與 ref 之間共有兩個不同點,首先,在方法內部會忽略 out 參數的任何初始值,其次,out 參數必須在方法執行期間指定:
class TestOut
{
private static void Add(int i, int j, out int result)
{
// The following line would cause a compile error:
// System.Console.WriteLine("Initial value inside method: {0}", result);
result = i + j;
return;
}
static void Main()
{
int total = 20;
System.Console.WriteLine("Original value of 'total': {0}", total);
Add(33, 77, out total);
System.Console.WriteLine("Value after calling Add(): {0}", total);
}
}
在這個情況下,Add 方法的第三個參數會使用 out 關鍵字來宣告,而且呼叫此方法時這個參數也需要使用 out 關鍵字。輸出結果如下:
Original value of 'total': 20
Value after calling Add(): 110
最後總括來說,當想要讓方法修改現有變數時請使用 ref 關鍵字,當想要傳回執行方法時所產生的值時請使用 out 關鍵字。當方法產生一個以上的呼叫程式碼之結果值時,out 關鍵字通常會與方法的傳回值一起搭配使用。