C# 6.0新特性

由於在博客中給出的代碼大多數都使用了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#團隊辛苦咯!

參考視頻鏈接

相關文章
相關標籤/搜索