方法(Method)

方法是一段具備名稱的程式碼區塊。你可以在程式其他地方透過呼叫方法名稱執行這段程式、傳入資料給方法,同時接收方法回傳的輸出資料。

方法的組成

如同前面所說,方法是類別的函式成員。

方法本質上就是函式;當一個函式定義在類別內部時,我們會將它稱作方法。在C語言當中,這類結構一律稱為函式。

方法由兩大核心元件構成:方法標頭(方法宣告標頭)方法本體

  1. 方法標頭:定義方法完整特徵,包含以下資訊:
    • 方法是否有回傳值,若有則必須指定回傳型別
    • 方法名稱
    • 可傳入/傳出的資料型別,以及資料處理規則
  2. 方法本體:由一連串可執行程式陳述式組成。程式執行時會從方法本體第一行陳述式開始,依序逐行執行。

來看範例

    string Introduce(string name,int age)
    {
        string words = $"hello my name is {name},i'm {age} years old";
        Console.WriteLine(words);
        return words;
    }Code language: C# (cs)

方法標頭: string Introduce(string name,int age)

  • string :回傳型別,為字串
  • Introduce:方法名稱
  • (string name,int age):參數清單。這兩者本身也是變數,用來接收外部傳入的姓名與年齡數值,之後便能在方法本體內使用。
上圖為方法各個組成部分說明

該如何呼叫這個方法?

這個方法定義於Program類別,和Main方法放在同一個類別之中。但Main是靜態(static)方法,靜態方法無法直接呼叫非靜態方法。若要呼叫Introduce,必須先建立Program的執行個體,透過執行個體呼叫。

class Program
{
    static void Main()
    {
        Program program = new Program();
        program.Introduce("John", 30);
    }

    string Introduce(string name,int age)
    {
        string words = $"hello my name is {name},i'm {age} years old";
        Console.WriteLine(words);
        return words;
    }
}Code language: C# (cs)

如果像下面這樣直接呼叫,會發生編譯錯誤

正確寫法是在Main函式內使用new建立Program執行個體,再透過執行個體呼叫Introduce

Program program = new Program();//√
program.Introduce("John", 30);Code language: C# (cs)

方法本體

方法本體可以包含零行或多行可執行陳述式。

方法本體屬於程式碼區塊(大括號包覆的一組陳述式),程式碼區塊中可以撰寫以下內容:

  • 區域變數
  • 流程控制結構(迴圈、分支判斷等)
  • 方法呼叫,用來呼叫其他方法
  • 巢狀子程式碼區塊
  • 內部區域函式(定義在方法內的子方法)〔後續章節介紹〕
class Program
{
    static void Main()
    {
        int age = 3; // 區域變數,初始值3
        while (age > 0) // 流程控制結構
        {
            --age;
            Introduce("Tom", age); // 方法呼叫
        }

        {
            //巢狀的子程式碼區塊
        }
    }

    static string Introduce(string name,int age)
    {
        string words = $"hello my name is {name},i'm {age} years old";
        Console.WriteLine(words);
        return words;
    }
}
Code language: JavaScript (javascript)

上面範例把Introduce函式加上static修飾詞,成為靜態函式。此時就能直接在Main函式呼叫,不再需要透過執行個體呼叫。


區域變數(Local Variables)

和前面提到的執行個體欄位一樣,區域變數用於存放資料;但執行個體欄位大多用來儲存物件狀態,區域變數只用於存放臨時、單次運算所需的資料。

當區域變數所屬的方法執行完畢,區域變數就會從堆疊移出;若是實值型別,變數直接銷毀;若是參考型別,則會在後續某個時刻由垃圾回收器回收銷毀。

1. 區域變數宣告語法
型別 變數名稱 = 初始值;
  • 變數名稱:自訂識別項
  • = 初始值:選用初始設定子,用來指派變數初始數值

2. 區域變數核心規則

  1. 生命週期與有效範圍:僅存在於宣告它的程式碼區塊,以及區塊內所有巢狀子區塊
    • 變數從宣告該變數的程式碼行開始生效建立
    • 程式碼區塊執行結束後,變數立刻失效銷毀
  2. 宣告位置不受限制:可以寫在方法本體任意位置,但必須先宣告、後使用
    static void Main()
    {
        int age = 3; //區域變數
        Phone p = new Phone(); //自訂型別的區域變數

        {
            int one = 1; //屬於子程式碼區塊的區域變數
            bool two = false;
        }

        double d = 0;
    }Code language: JavaScript (javascript)
上圖巢狀子程式碼區塊執行完畢後,one、two兩個區域變數會移出堆疊並銷毀

執行個體欄位 vs 區域變數

執行個體欄位區域變數
生命週期物件執行個體建立時產生;
物件無法存取時銷毀
宣告程式碼行生效;
所屬程式碼區塊執行完畢銷毀
預設初始化編譯器自動指派該型別預設值無自動初始化;
未指派數值就使用會直接報編譯錯誤
記憶體存放位置全部存放在堆積(Heap),
不論實值型別/參考型別
實值型別:堆疊(Stack);
參考型別:參考存堆疊,物件資料存堆積

方法(Method)

發佈留言

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