1. 程式人生 > 實用技巧 >C# 9.0 新特性簡析

C# 9.0 新特性簡析

【摘要】

  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();