下面說的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 老是須要在外面定義咱們變量。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在後面,即便他後面有語句
之前咱們須要返回多個有點難,可使用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,咱們須要定義二進制,要是使用原的仍是難,我就以爲這個功能好。能夠分割,咱們二進制容易打着就不對,有了分割能夠看出沒幾個,這樣看代碼簡單,這個功能應該是原先就可獲得,如今使用_以爲仍是沒有用。
咱們返回的是引用,如今返回能夠是值,咱們返回數組中的一個值,那麼修改這個值,由於放進引用,咱們輸出數組是修改的值
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/