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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM