C# 6:以表示式為本體的成員
文章目錄
「以表示式為本體的成員」好像太拗口了?英文是 expression-bodied members。意思是:以表示式來作為成員本體。我想,還是直接看程式碼比較清楚吧。
C# 6 之前:
此範例中的唯讀屬性 ElapsedSeconds 的值是動態計算出來的,代表從 startTime 開始之後到目前為止經過了幾秒鐘。
C# 6 可以這麼寫:
這裡使用了 C# 6 新增的語法:以表示式作為成員本體。如你所見,程式碼變得更簡短了。原本的唯讀屬性 ElapsedSeconds 的 get 方法本體不見了,取而代之的是屬性名稱後面跟著一個以 => 符號開始的 lambda 表示式——其實骨子裡,編譯器會把它編譯成一個 get 方法,就跟先前的 BeforeCSharp6 類別裡面的寫法一樣。
要注意的是,這個表示式只能有一行敘述,而不能是包含多行程式碼的區塊。因此,你不能這麼寫:
此外,「以表示式為本體的成員」可以是屬性或方法,而且有沒有傳回值都行。底下是更多範例:
顯然地,對於那些只包含一行程式碼的屬性或方法,若使用「以表示式為本體的成員」語法來撰寫,程式碼會再稍微簡短一些。
(Happy coding with C# 6 syntax sugar!)
摘自《C# 本事》(alpha 版)
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 版)