C# 9.0已經正式發布了,vs2019更新到16.8.1版本后就能使用。這里就大概講述其中幾個新特性。(其它特性看了也不知道該怎樣運用=_=)
1.屬性的init
當需要給對象的屬性進行初始化賦值,而我們又只需要對該屬性賦值一次,后面就不允許修改該屬性。我們可以直接在屬性定義時賦值。
class Student { public int No { get; } = 1; public string Name { get; } = "張三"; public int Age { get; } = 18; }
有的情況是需要我們在業務邏輯中去給類進行初始化,一般情況下,我們可以通過帶參數的構造函數去處理。
class Student { public int No { get; } public string Name { get; } public int Age { get; } public Student(int no,string name,int age) { No = no; Name = name; Age = age; } } //運行 Student student = new Student(1,"張三",18); student.Name = "dd";//報錯,只讀不可修改
這樣是可以解決只能初始化一次的問題,但如果每個類都得這些寫一個這樣的構造函數,還是挺麻煩。init關鍵字就可以使之簡便。
public class Student { public int No { get; init; } public string Name { get; init; } public int Age { get; init;} } //運行 Student student = new Student { No = 1, Name = "張三", Age = 18 }; student.Name = "張三";//報錯,不能修改
如果對象初始化完成,這個init-only會保護這個對象的屬性不被更改。
2.record類型
這個record仍然是一個類,使用它就是為了數據對比可以更加便捷。舉個例子。
public class Dog { public string Name { get; set; } public string Color { get; set; } public int Age { get; set; } }
Dog dog1 = new Dog { Name = "旺財", Color = "yellow", Age = 1 }; Dog dog2 = new Dog { Name = "旺財", Color = "yellow", Age = 1 }; Console.WriteLine("是否一樣?{0}", dog1 == dog2);
上面創建的兩個實例,描述的都是同一個東西,但輸出結果卻是,是否一樣?False。
因為程序對比的是引用是否相同,而我們想對比的卻是屬性數據是否相同。record類型可以讓我們比較內容。
把上面的類聲明為record。
public record Dog { public string Name { get; set; } public string Color { get; set; } public int Age { get; set; } }
再重新對比dog1和dog2,結果是,是否一樣?True。
record實際上是重寫了Equal 方法,循環遍歷里面的屬性的Equal方法,從而就可以基於值相同的相等,兩個record對象就像不是同一個對象也可以相等。
3.模式匹配
對變量的校驗做了強化,在傳統的switch寫法中,變量只能對比單一的值。
int 分數 = 80; switch (分數) { case 10: Console.WriteLine("不及格"); break; case 60: Console.WriteLine("及格"); break; case 80: Console.WriteLine("良"); break; case 90: Console.WriteLine("優"); break; }
現在可以使用關系運算符>、<,或者邏輯邏輯操作符and、or、not等。
int 分數 = 80; switch (分數) { case < 60: Console.WriteLine("不及格"); break; case 60: Console.WriteLine("及格"); break; case >= 60 and < 90: Console.WriteLine("良"); break; case >= 90: Console.WriteLine("優"); break; }
not模式的常見的使用是將它用在null常量模式上,如not null。
if (a is not null) { }
4.類型推導new表達式
類型推導是根據表達式所在上下文來獲取它所使用的類型,比如lambda總是涉及到類型推導的。
原本的new表達式后面一定是要帶類型的,現在可以省略了。
//正常寫法 Dog dog = new Dog(); //省略寫法 Dog dog = new();
