C# 7.0

下面說的C# 7.0功能將在將來發布,首先須要安裝Visual Studio 15 Preview 4,據說這個版本安裝很快。git

C# 7.0的功能主要是數據處理,讓代碼更簡潔,讓代碼性能更高github

讓代碼簡單這個我以爲不如6.0,性能是Iot,C#速度差,垃圾wr就讓C#能夠訪問內存直接,這個下面沒有說數組

比較大修改是可使用Tuples 來多個返回,實際上是抄襲了某腳本ide

多返回這個在以前也有作,他這樣就是小改。函數

修改大的有Case 能夠判斷類型,其實這個使用是咱們有類 a,類b、c繼承a,這時有用性能

若是以爲這個和我同樣以爲沒用,能夠去Visual studio 按反饋噴3d

若是好奇他是怎麼弄,能夠查看https://github.com/dotnet/roslyncode

out 返回值定義

咱們之前要使用out 老是須要在外面定義咱們變量。blog

public void PrintCoordinates(Point p)

  {

    int x, y; // 在外面定義

    p.GetCoordinates(out x, out y);

    WriteLine($"({x}, {y})");

  }

在7.0咱們可使用在out定義咱們變量,這樣看起來不是在一個區域,可是能夠減小個人代碼繼承

public void PrintCoordinates(Point p)

{

    p.GetCoordinates(out int x, out int y);

    WriteLine($"({x}, {y})");

}

在out定義類型,定義能夠用var

看到這我才說這樣有用,若是咱們開始沒有肯定咱們返回的是什麼,而後直接定義,須要修改地方多,可是若是咱們使用Var就可讓咱們定義修改少,通常在寫就須要先想咱們須要用什麼,不要老是改

若是咱們使用一個返回爲bool,那麼能夠在{使用out的值

public void PrintStars(string s)

{

    //轉換,能夠是數字,顯示

    if (int.TryParse(s, out var i)) { WriteLine(new string('*', i)); }

    else { WriteLine("Cloudy - no stars tonight!"); }

}

若是有返回值咱們不須要,能夠out *,這樣咱們就不用知道這個返回值,原先不須要使用我還要想一個變量,而後vs說我這個沒有使用,如今咱們直接就不給他名

在咱們下面有返回多個,這時不須要的能夠用*

模式匹配

C# 7.0可使用is一部分代替as

咱們須要判斷一個值是不是一個類型,若是是那麼賦值

o is int i

那麼咱們就能夠直接使用i

在咱們一個判斷,若是咱們存在了object o是int,那麼咱們就使用int i=(int)o;

若是咱們object不是int,那麼轉換object o是string,string s=(string)o;

int.TryParse(s,out i);

咱們能夠簡化,判斷是否是int,若是是給i,這時就返回true

而後判斷是否是string,是就轉,成功使用i

if (o is int i || (o is string s && int.TryParse(s, out i)) { /* use i */ }

咱們在Case能夠選擇類型

switch(shape)

{

    case Circle c:

        WriteLine($"circle with radius {c.Radius}");

        break;

    case Rectangle s when (s.Length == s.Height):

        WriteLine($"{s.Length} x {s.Height} square");

        break;

    case Rectangle r:

        WriteLine($"{r.Length} x {r.Height} rectangle");

        break;

    default:

        WriteLine("<unknown shape>");

        break;

    case null:

        throw new ArgumentNullException(nameof(shape));

}

case順序很重要,default在後面,即便他後面有語句

Tuples

之前咱們須要返回多個有點難,可使用out參數,能夠Tuples

(string, string, string) LookupName(long id) // tuple return type

{

    ... // 返回多個數據,咱們在數據拿到多個數據

    return (first, middle, last); // tuple literal

}

var names = LookupName(id);

咱們這樣用第一返回值:names.Item1和原來幾乎不改,這樣對於返回值很差,由於咱們難以去記

咱們要給他一個好記的

(string first, string middle, string last) LookupName(long id)

咱們使用第一個names.first,這樣使用就不會難,可使用咱們須要的名字

返回可使用return (first, middle, last);,若是定義了名稱,可使用

return last:last,first:first

咱們可使用多個var來返回

(string first, string middle, string last) = LookupName(id1);

第一個first就是返回的第一個,咱們可使用var ,由於咱們不須要定義類型(var fist,var midd)=Lookup(id);

若是咱們有多個var,那麼咱們能夠簡單var (first, middle, last) = LookupName(id1);

咱們不關係第二個返回值,可使用(var first,*)=Lookup(id);

本地函數

咱們能夠在函數裏面定義函數,這是本地

這個在不少垃圾語言都有

public int Fibonacci(int x)

{

    if (x < 0) throw new ArgumentException("Less negativity please!", nameof(x));

    return Fib(x).current;

//下面本地函數

    (int current, int previous) Fib(int i)

    {

        if (i == 0) return (1, 0);

        var (p, pp) = Fib(i - 1);

        return (p + pp, p);

    }

}

改進常量

咱們有比較長數字,那麼咱們在定義須要比較難知道他是否寫對

咱們可使用,下劃線,這樣是分割,能夠數咱們寫了多少數字,能夠看咱們是否是寫錯

var d = 123_456;

var x = 0xAB_CD_EF;

咱們還能夠定義2進制,原來是沒法定義

var b = 0b1010_1011_1100_1101_1110_1111;

這個主要在二進制好,原先的使用true和false,若是還要使用,是用byte轉換,若是Iot,咱們須要定義二進制,要是使用原的仍是難,我就以爲這個功能好。能夠分割,咱們二進制容易打着就不對,有了分割能夠看出沒幾個,這樣看代碼簡單,這個功能應該是原先就可獲得,如今使用_以爲仍是沒有用。

ref returns 返回值

咱們返回的是引用,如今返回能夠是值,咱們返回數組中的一個值,那麼修改這個值,由於放進引用,咱們輸出數組是修改的值

public ref int Find(int number, int[] numbers)

{

    for (int i = 0; i < numbers.Length; i++)

    {

        if (numbers[i] == number) 

        {

            return ref numbers[i]; // return the storage location, not the value

        }

    }

    throw new IndexOutOfRangeException($"{nameof(number)} not found");

}

int[] array = { 1, 15, -39, 0, 7, 14, -12 };

ref int place = ref Find(7, array); 

place = 9; // 修改

WriteLine(array[4]); // 9

https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/

知識共享許可協議

相關文章
相關標籤/搜索