C# 6:以表示式為本體的成員

「以表示式為本體的成員」好像太拗口了?英文是 expression-bodied members。意思是:以表示式來作為成員本體。我想,還是直接看程式碼比較清楚吧。

C# 6 之前:

class BeforeCSharp6
{
    private DateTime startTime = DateTime.Now;

    public int ElapsedSeconds
    {
        get
        {
            return (DateTime.Now - startTime).Seconds;
        }
    }
}

此範例中的唯讀屬性 ElapsedSeconds 的值是動態計算出來的,代表從 startTime 開始之後到目前為止經過了幾秒鐘。

C# 6 可以這麼寫:

class NewInCsharp6
{
    private DateTime startTime = DateTime.Now;

    public int ElapsedSeconds => (DateTime.Now - startTime).Seconds;
} 

這裡使用了 C# 6 新增的語法:以表示式作為成員本體。如你所見,程式碼變得更簡短了。原本的唯讀屬性 ElapsedSeconds 的 get 方法本體不見了,取而代之的是屬性名稱後面跟著一個以 => 符號開始的 lambda 表示式——其實骨子裡,編譯器會把它編譯成一個 get 方法,就跟先前的 BeforeCSharp6 類別裡面的寫法一樣。

要注意的是,這個表示式只能有一行敘述,而不能是包含多行程式碼的區塊。因此,你不能這麼寫:

    public int ElapsedSeconds => 
    {
        return (DateTime.Now - startTime).Seconds; // 編譯失敗!
    }

此外,「以表示式為本體的成員」可以是屬性或方法,而且有沒有傳回值都行。底下是更多範例:

    public string FullName => this.FirstName + " " + this.LastName;
    public Color GetColor(int r, int g, int b) => Color.FromArgb(r, g, b); 
    public void Log(string msg) => Console.WriteLine(msg); 
    public static string HowCold(int temperature) =>
        temperature > 17 ? "不冷" : "挺冷";
    public Employee this[int id] => this.FindEmployee(id); // 索引子也可以用此語法。

顯然地,對於那些只包含一行程式碼的屬性或方法,若使用「以表示式為本體的成員」語法來撰寫,程式碼會再稍微簡短一些。

(Happy coding with C# 6 syntax sugar!)

摘自《C# 本事》(alpha 版)

沒有留言:

技術提供:Blogger.
回頂端⬆️