C# 9.0 新特性簡析
阿新 • • 發佈:2020-11-27
【摘要】
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; } publicint 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();