參數

參數分為形式參數與實際參數

形式參數

形式參數英文為 Formal Parameter,一般簡稱形參、形式引數。

形式參數是宣告在方法名稱後括號內的特殊區域變數,並非定義在方法主體之中。

下方函式名稱後方括號裡的兩個變數,就是形式參數。有學過C語言的讀者,對這個概念應該不會陌生。

// x、y 是兩個形式參數
public void PrintArea(int x, float y )
{
}
Code language: C# (cs)
  1. 具備資料型別與變數名稱,可讀取、可修改;
  2. 定義位置位於方法主體外,方法執行前自動完成初始化out 輸出參數除外);
  3. 多個參數以逗號分隔,參數數量沒有上限;
  4. 在方法主體內的使用方式,與一般區域變數完全相同。

簡單來說,形式參數本質就是特殊的區域變數,用途是接收呼叫函式時傳入的數值。也就是說形式參數的賦值動作發生在函式呼叫當下,當程式流程進入函式內部時,形式參數已經完成賦值。

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)

呼叫方法時,用來提供數值給形式參數的變數或是運算式,稱作實際參數;方法開始執行前,會使用實際參數的值初始化對應的形式參數。

  1. 實際參數撰寫在方法呼叫的括號內;
  2. 型別對應規則:實際參數型別必須和對應形式參數相符,或是編譯器支援隱式型別轉換
  3. 位置對應:預設依照順序逐一配對,也就是位置參數(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不會發生資料遺失。就像是把小箱子放進大箱子,可以完整容納;反過來嘗試把大箱子塞進小箱子,就無法存放。

參數

Previous:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *