由於在博客中給出的代碼大多數都使用了C#6.0的新特性,若是各位對C#6.0還不瞭解,能夠簡單的看一下這篇隨筆。o( ̄▽ ̄)djson
先來看一個Point類安全
public class Point { public int X { get; set; } public int Y { get; set; } public Point(int x, int y) { X = x; Y = y; } public double Dist { get { return Math.Sqrt(X * X + Y * Y); } } public override string ToString() { return String.Format("({0}, {1})", X, Y); } }
如今咱們一步步來看在C#6.0中的改進ide
1->在之前版本的C#代碼中全部的自動屬性都必須有Setter,可是如今能夠沒有了。注意,不能只有Setter函數
public class Point { public int X { get; } public int Y { get; }
public double Dist { get { return Math.Sqrt(X * X + Y * Y); } } public override string ToString() { return String.Format("({0}, {1})", X, Y); } }
2->同時如今也能夠爲自動屬性直接設置初值,無需放到構造函數中this
public class Point { public int X { get; } = 2; public int Y { get; set; } = 1;
public double Dist { get { return Math.Sqrt(X * X + Y * Y); } } public override string ToString() { return String.Format("({0}, {1})", X, Y); } }
3->使用靜態成員spa
3.1在上面的代碼中看一看到調用Sqrt函數須要使用Math開頭,寫一次兩次還好,若是一個類中大規模使用Sqrt每次都要先寫一個Math會不會太麻煩了!線程
如今咱們來看看如何改進。code
首先在命名空間中添加下面這一行代碼orm
using static System.Math;
規則是 using + static + 靜態類命名空間視頻
因而Dist屬性就可改爲下面這樣
public double Dist { get { return Sqrt(X * X + Y * Y); } }
3.2上面的規則也適用於枚舉類型
using static Desktop.Color; namespace Desktop { enum Color { Yellow, Red } class Program { static void Main(string[] args) { Console.WriteLine(Yellow); Console.ReadKey(); } } }
4->關於String.Format()方法的改進
這是經典寫法
return String.Format("({0}, {1})", X, Y);
接下來一步步簡化(先將String.Format用一個$代替)
return $"({0}, {1})", X, Y);
而後將0,1兩個佔位符直接換成X,Y
return $"({X}, {Y})";
好的化簡完成。
5->對於Lambda表達式的改進
之前寫匿名函數的時候能夠寫成一行,如今通常的函數也能夠了
ToString()函數能夠改寫成以下形式
public override string ToString() => $"({X}, {Y})";
相似的屬性能夠改爲這樣
public double Dist => Sqrt(X * X + Y * Y);
注意屬性是沒有()的
簡化後的Point類是這樣的
public class Point { public int X { get; } = 2; public int Y { get; set; } = 1;
public double Dist => Sqrt(X * X + Y * Y); public override string ToString() => $"({X}, {Y})"; }
6->索引初始化
先來看一段Json.Net的代碼
public JObject ToJson() { var result = new JObject(); result["X"] = X; result["Y"] = Y; return result; }
改進後的代碼能夠這麼寫
public JObject ToJson() { var result = new JObject() { ["X"] = X, ["Y"] = Y }; return result; }
最終能夠化簡成一行代碼
public JObject ToJson() => new JObject() { ["X"] = X, ["Y"] = Y };
7-> ?.運算符
?.運算符其實很簡單,主要就是檢查變量是否爲null,若是不爲null那就執行.
先來看一個函數,這個判斷語句中大部分的檢查都是在
public static Point FromJson(JObject json) { if (json != null && json["X"] != null && json["X"].Type == JTokenType.Integer && json["Y"] != null && json["Y"].Type == JTokenType.Integer ) { return new Point((int)json["X"], (int)json["Y"]); } return null; }
這個函數能夠用?.運算符化簡成
public static Point FromJson(JObject json) { if (json != null && json["X"]?.Type == JTokenType.Integer && json["Y"]?.Type == JTokenType.Integer ) { return new Point((int)json["X"], (int)json["Y"]); } return null; }
若是json["x"]爲null,那麼就不執行. 若是json["x"]不爲null,那麼就會執行.而後判斷類型是否爲int
因此代碼能夠被再次化簡
public static Point FromJson(JObject json) { if (json?["X"]?.Type == JTokenType.Integer && json?["Y"]?.Type == JTokenType.Integer ) { return new Point((int)json["X"], (int)json["Y"]); } return null; }
?.還有一個比較大的用處在觸發事件的時候
OnChanged(this, args);
若是此時OnChanged爲空顯然是不行的因此呢,能夠改寫成這樣
if (OnChanged == null) { OnChanged(this, args); }
若是很不幸的另一個線程就在判斷以後,觸發事件以前,再次設置OnChanged變爲null,一樣會致使錯誤
爲了保證線程安全
須要先Copy一份,可是這樣寫顯然就。。。
var onChanged = OnChanged; if (onChanged != null) { onChanged(this, args); }
如今能夠改寫成這樣
OnChanged?.(this, args);
8-> 支持在catch和finally塊中使用await
好滴以上就是C#6.0的一些新特性,這些改進我的感受仍是很是實用的!C#團隊辛苦咯!