out變數
可以直接在方法中使用out申明變數 int.TryParse("123", out var result);
元組
元組的申明
var alphaBetaStart = (alpha: "a", beta: "b"); Console.WriteLine($"{alphaBetaStart.alpha}{alphaBetaStart.beta}");
解構與元組
private class User { public string Name { get; } = "Bob"; public string Email { get; } = "[email protected]"; public int Age { get; set; } = 25; //解構 public void Deconstruct(out string name, out string email) { (name, email) = (Name, Email); } } //解構元組 var u = new User(); var (name, email) = u; Console.WriteLine($"{name}{email}");
棄元
//棄元 var (_, email2) = u; Console.WriteLine($"{email2}");
使用_代替了解構的回傳值name
模式匹配
什么是模式匹配
官方檔案的定義是:模式匹配是一種可讓你對除物件型別以外的屬性實作方法分派的功能;簡而言之對于某一個抽象物件的抽象方法,他不同的子類有不同實作,現在我們也可以對屬性使用is關鍵字進行類別判斷進行不同的操作
if (input is int i) { Console.WriteLine($"{i}是int型別"); } else if (input is string j) { Console.WriteLine($"{j}是string型別"); } private object input = "123";
switch匹配模式
上面例子是is的模式匹配,使用switch可以撰寫更加復雜的模式匹配
var nus = new List<int> { 1, 2, 3, 4, 5, -1, -8, -10 }; var sequence = new List<object> { 0, -10, -20, 10, new User(), 20, "book", "doom", "time", nus }; //switch的模式匹配 foreach (var content in sequence) { var sum = 0; switch (content) { case 0: Console.WriteLine("0"); break; case IEnumerable<int> child: { foreach (var item in child) sum += item < 0 ? item : 0; Console.WriteLine($"child:{sum}"); break; } case int n when n > 0: Console.WriteLine($"n:{n}"); break; case string s when s.Contains("oo"): Console.WriteLine($"s:{s}"); break; default: Console.WriteLine("default"); break; } }View Code
Ref 區域變數和回傳結果
對于參考型別A,若將A賦值給B(B=A),改變B的值則A也會改變,而對于值型別(如int),若將D賦值給C,改變C的值D值不變,現在使用ref關鍵字可以完成改變C導致D的值改變
int x = 10; ref var num = ref x;//使用ref將x的賦值給num,雖然是struct但是改變num也會改變x,反之亦然,相當于num和x是參考型別 num = 9;
此時輸出x,則其值為9
也可在方法中使用
public ref int RefVariable(int[,] matrix) { for (var i = 0; i < 3; i++) { for (var j = 0; j < 3; j++) { if (matrix[i, j] % 2 == 0) { return ref matrix[i, j]; } } } throw new InvalidOperationException("Not found"); }
此時如果改變回傳值,matrix表示的二維陣列該物件值也會改變
本地函式(區域函式)
public IEnumerable<int> LocalFunction(int min,int max) { if(min < 0 || min > 10) throw new ArgumentException("min范圍是0到10"); if (max < 0 || max > 10) throw new ArgumentException("max范圍是0到10"); if(min > max) throw new ArgumentException("max必須不小于min"); return Get24(); IEnumerable<int> Get24() { for (int i = min; i < max; i++) { if (i == 2 || i == 4) yield return i; } } }
屬性運算式
private string _name; public string Name { get => _name; set => _name = value ?? string.Empty; }
通用的異步回傳型別
/// <summary> /// 使用ValueTask代替參考型別的Task /// </summary> /// <returns></returns> private async ValueTask<int> Func() { await Task.Delay(10); return 5; }
數字文本語法改進與默認文本運算式
數字文本語法改進
/// <summary> /// 數字文本語法改進0b開頭表示二進制_分割方便閱讀,不影響數值 /// </summary> public void NumberText() { int a = 0b0001_0001; int b = 100_100; }
默認文本運算式
/// <summary> /// 默認文本運算式 /// </summary> public Func<string, bool> Func1 { get; set; } = default;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/6407.html
標籤:C#
上一篇:C#6.0新特性
