參數分為形式參數與實際參數
形式參數
形式參數英文為 Formal Parameter,一般簡稱形參、形式引數。
形式參數是宣告在方法名稱後括號內的特殊區域變數,並非定義在方法主體之中。
下方函式名稱後方括號裡的兩個變數,就是形式參數。有學過C語言的讀者,對這個概念應該不會陌生。
// x、y 是兩個形式參數
public void PrintArea(int x, float y )
{
}
Code language: C# (cs)
- 具備資料型別與變數名稱,可讀取、可修改;
- 定義位置位於方法主體外,方法執行前自動完成初始化(
out輸出參數除外); - 多個參數以逗號分隔,參數數量沒有上限;
- 在方法主體內的使用方式,與一般區域變數完全相同。
簡單來說,形式參數本質就是特殊的區域變數,用途是接收呼叫函式時傳入的數值。也就是說形式參數的賦值動作發生在函式呼叫當下,當程式流程進入函式內部時,形式參數已經完成賦值。
public void PrintArea( int x, float y )
{
float area = x * y; // x、y 為形式參數,area 為一般區域變數,用來存放x乘以y的結果
Console.WriteLine($"計算面積: { x } * { y } = { area }");
}
Code language: C# (cs)
可執行範例
class Program
{
static void Main()
{
Program program = new Program();
program.PrintArea(10,6.5F);
}
public void PrintArea(int x, float y)
{
float area = x * y; // x、y 為形式參數,area 為一般區域變數,用來存放x乘以y的結果
Console.WriteLine($"計算面積: {x} * {y} = {area}");
}
}Code language: C# (cs)
輸出結果
計算面積: 10 * 6.5 = 65
呼叫函式時,等同於將x初始值設為10、y初始值設為6.5
6.5F後面的F代表此數值是float單精確度浮點數;若沒有加上F後綴,編譯器會判定為double型別,進而引發錯誤。
單精確度float與雙精確度double,在記憶體佔用的位元數不同,因此兩者能夠儲存數值的精準度有所差異。
所謂精準度,指資料型別最多能夠可靠儲存多少位小數;一旦超過限制,數值就可能產生誤差,而這項特性取決於型別在記憶體所配置的位元數。

x與y是形式參數。進行呼叫時
概念上就像是建立兩個區域變數並給予初始值。
int x = 10;
float y = 6.5F;Code language: C# (cs)
注意事項:
形式參數的型別、順序、格式搭配方法名稱,共同構成方法簽章。可以把簽章想像成函式的身分證。後續章節會繼續說明簽章;簽章是否一致,決定兩個方法是否為同一個,後續也會介紹函式多載。
實際參數
英文名稱:Actual Parameters(實際參數,也常稱引數 arguments)
呼叫方法時,用來提供數值給形式參數的變數或是運算式,稱作實際參數;方法開始執行前,會使用實際參數的值初始化對應的形式參數。
- 實際參數撰寫在方法呼叫的括號內;
- 型別對應規則:實際參數型別必須和對應形式參數相符,或是編譯器支援隱式型別轉換;
- 位置對應:預設依照順序逐一配對,也就是位置參數(positional parameters)。
舉例來說,修改上方程式碼的Main函式如下。呼叫位置的第一個參數是數值常數5,第二個參數則是區域變數f。
Program program = new Program();
float f = 6.3F;
program.PrintArea(5,f);
// 5 屬於常數運算式形式的實際參數,f 為變數形式的實際參數
// 位置對應關係:5 → x,f → y
Code language: C# (cs)
進行呼叫時,實際參數的數值會複製給相同位置的形式參數,接著才執行方法主體程式碼。

位置參數
class Calculate
{
// 兩個int形式參數
public int Sum(int x, int y)
{
return x + y;
}
// 兩個float形式參數
public float Avg(float x, float y)
{
return (x + y) / 2.0F;
}
}
class Program
{
static void Main()
{
Calculate cal = new Calculate();
int num = 6;
// Sum:int實際參數對應int形式參數
Console.WriteLine("Sum: {0} and {1} is {2}",
5, num, cal.Sum(5, num));
// Avg:int實際參數自動隱式轉換為float形式參數
Console.WriteLine("Avg: {0} and {1} is {2}",
5, num, cal.Avg(5, num));
}
}
Code language: PHP (php)
輸出結果
Sum: 5 and 6 is 11
Avg: 5 and 6 is 5.5Code language: HTTP (http)
C# 支援由範圍較小型別往範圍較大型別進行隱式轉換(int → float);反向 float → int 會造成編譯錯誤,必須手動加上強制轉換。
num 是int型別變數,當作實際參數傳入Avg函式的float形式參數時,編譯器會自動執行隱式轉換,不會報錯。原因是int能夠表達的數值範圍,完整包含在float的數值範圍內。

因此把int傳遞給float不會發生資料遺失。就像是把小箱子放進大箱子,可以完整容納;反過來嘗試把大箱子塞進小箱子,就無法存放。
參數