標籤:
作為一門專為程(yu)序(fa)員(tang)考慮的語言,感受一下來自微軟的滿滿的惡意...
1. 字串內聯
在之前的版本中,常用的格式化字串:
var s = String.Format("{0} is {1} year{{s}} old", p.Name, p.Age);
在 C# 6 中:
//無格式var s = $"{p.Name} is {p.Age} year{{s}} old";//帶格式var s = $"{p.Name,20} is {p.Age:D3} year{{s}} old";//帶子運算式var s = $"{p.Name} is {p.Age} year{(p.Age == 1 ? "" : "s")} old";
2. 空條件運算子
在之前的版本中對於 可空類型 或 動態類型 ,擷取子項目往往較為複雜:
if(someSchool != null && someSchool.someGrade != null && someSchool.someGrade.someClass != null){ return someSchool.someGrade.someClass.someOne;}
在 C# 6 中,引入了新的運算子:
return someSchool?.someGrade?.someClass?.someOne;//也可以使用下標運算,例如//return someArray?[0];
如果 ?. 運算子的左項為 null ,則直接返回 null 。
對於方法或者委託的執行,可以使用 Invoke:
someMethod?.Invoke(args);
3. nameof 運算式
可以直接返回傳入變數的名稱,而無需複雜的反射。
int someInt;Console.WriteLine(nameof(someInt)); //"someInt"
註:如果是前面帶有命名空間和/或類名,只返回最後的變數名。
4. 索引初始化器
在 C# 6 中簡化了對 Dictionary 的初始化方法:
var numbers = new Dictionary<int, string> { [7] = "seven", [9] = "nine", [13] = "thirteen" };
5. 條件異常處理
在 C# 6 中可以選擇性地對某些異常進行處理,無需額外增加判斷過程:
try { … } catch (MyException e) if (myfilter(e)) { … }
6. 屬性初始化器
在 C# 6 中可以直接對屬性進行初始化:
public class Customer { public string First { get; set; } = "Jane"; public string Last { get; set; } = "Doe"; }
以及可以類似定義唯讀屬性。
7. 成員函數的 lambda 定義
在 C# 6 中可以使用 lambda 運算式來定義成員方法。
public class Point{ public Point Move(int dx, int dy) => new Point(x + dx, y + dy); public static Complex operator +(Complex a, Complex b) => a.Add(b); public static implicit operator string(Person p) => $"{p.First}, {p.Last}";}
8. 結構體的參數建構函式
在 C# 6 中可以建立結構體的帶參數建構函式。
struct Person { public string Name { get; } public int Age { get; } public Person(string name, int age) { Name = name; Age = age; } public Person() : this("Jane Doe", 37) { } }
9. using 靜態類
在 C# 6 中 using 除了可以用於命名空間也可以用於靜態類。
using System.Console; using System.Math;class Program { static void Main() { WriteLine(Sqrt(3*3 + 4*4)); } }
來自:http://www.zhihu.com/question/27421302
感受C#6.0新文法