out變數 可以直接在方法中使用out申明變數 int.TryParse("123", out var result); 元組 元組的申明 var alphaBetaStart = (alpha: "a", beta: "b"); Console.WriteLine($"{alphaBetaStar ...
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;