前言

上一篇我們簡單介紹控制流程,而在這一章節我們將簡單介紹方法。在程式開發過程中,我們能執行一個子程式區塊,完成一個動作,我們簡單稱之方法(method)。方法能有效提升程式可用性與可讀性:將常用的程式區塊抽出,避免相同的程式重複出現;好的命名可以讓工程師快速了解這個子程式區塊的目的,提升開發效能。本篇文章若有錯誤或任何建議,請各位先進不吝指教。

關鍵字:方法多載選擇性參數擴增方法ret 與 out



介紹

方法的命名方式為動詞,用來描述一個動作或行為,下面為一些常見的命名範例:
GetWalletById
CreateOrUpdatePlayer
IsPlayerTokenExpired

下面為方法的主體:(存取修飾詞我們會在類別這章節介紹)

下面是一個簡單的方法範例:
static void Main(string[] args)
{
    int amount = 1000;

    SaveMoney(1000);
}

private static void SaveMoney (int amount)
{
    // do something
}

當然,我們也能在物件內宣告方法,在初始化物件後即可使用:
public class Student
{
    public List<int> Score { get; set; }

    public int GetHighScore()
    {
        int highScore = 0;
        foreach (var item in Score)
        {
            highScore = Math.Max(item, highScore);
        }
        return highScore;
    }
}
static void Main(string[] args)
{
    Student student = new Student();
    student.Score = new List<int>();
    student.Score.Add(20);
    student.Score.Add(30);
    Console.WriteLine(student.GetHighScore());
}



多載

方法的識別方式為 方法名稱傳入參數,意思指您只要您傳入參數不同,您可以擁有數個相同名稱的方法,我們稱之為多載。如下列程式所示,只要您的方法名稱與傳入參數組合不一致,您就可以有相同名稱的方法:
public int StratSomething()
{
    return 0;

}

public int StratSomething(string name)
{
    return 0;
}

public int StratSomething(int age)
{
    return 0;
}



選擇性參數

我們可以給傳入參數預設值:當我們沒有傳入參數為 null 時,方法將自動採用選擇性參數。如下列程式所示:
static void Main(string[] args)
{
    GetSomething("duran");
}

public static void GetSomething(string firstName, string lastName = "hsieh")
{
    Console.WriteLine("Name:" + firstName + " " + lastName);
}




擴展方法

我們自行能為 .NET 與第三方套件增加客製方法,提供開發期間工程師使用。擴展方法相當酷,使用方法如下:
public static class StringExtendsion
{
    public static string AddSymbolAtEnd(this string s)
    {
        return s + "!!";
    }
}
建立完成後,你在Visual Studio 自動完成清單中可以看見自己的擴展方法:

我們嘗試使用自己的擴增方法:
static void Main(string[] args)
{
    string stringExtendExample = "Hello World";
    Console.WriteLine(stringExtendExample.AddSymbolAtEnd());
}


ref and out

ref 與 out 為參數修飾詞,透過 out / ref 參數,你能直接取用並進行運算,不同的地方在於:
透過 ref 你能雙向傳入/傳出參數,方法內部不需要指派這個參數,而 out 在方法內部必須先指派。下列是 out 的範例:
class OutExample
{
    static void FillArray(out int[] array)
    {
        array = new int[3] { 3, 2, 1 };
    }

    static void Main()
    {
        int[] demoArray;

        FillArray(out demoArray);

        for (int i = 0; i < demoArray.Length; i++)
        {
            System.Console.Write(demoArray[i] + ", ");
        }
    }
}
3, 2, 1, 
下列是 ref 的範例:
class TestRef
{
    static void FillArray(ref int[] array)
    {
        if ( array == null )
        {
            array = new int[10];
        }
        array[0] = 1;
        array[2] = 3;
    }

    static void Main()
    {
        int[] demoArray = { 3, 2, 1};

        FillArray(ref demoArray);

        for (int i = 0; i < demoArray.Length; i++)
        {
            System.Console.Write(demoArray[i] + ", ");
        }
    }
}
1, 2, 3, 

參考資料

1. Study4TW 內部教材
2. ?: 運算子 (C# 參考) - Microsoft docs
3. ?? 運算子 (C# 參考) - Microsoft docs