C# 9.0 新特性

Record

1、record類型是引用類型
2、爲什麼會新增這一類型?
    1)面向對象編程中,比較兩對象是否相等,一般比較兩對象的內存地址是否一致。
    2)然而在一些語境中,我們關注的是對象的字段/屬性是否相等。在這種情況下進行比較則需要將對象內的所有字段/屬性的值依次進行比較,若全部相等則表示兩對象相等,否則不相等。爲了簡化該語境下的比較,微軟新增了record類型,此時可以直接進行比較。

    public class Cat{
        public string NickName { get; set; }
        public int Age { get; set; }
    }

    public record Dog{
        public string NickName { get; set; }
        public int Age { get; set; }
    }

    var cat1 = new Cat{ NickName="二愣子", Age=1 };
    var cat2 = new Cat{ NickName="二愣子", Age=1 };
    Console.WriteLine(cat1 != cat2);

    var dog1 = new Dog{ NickName="二狗子", Age=2 };
    var dog2 = new Dog{ NickName="二狗子", Age=2 };
    Console.WriteLine(dog1 == dog2); 

模式匹配

演變1:
    int score = 99;
	switch(score){
        case 10:
            Console.WriteLine("丟人了!!!");
            break;
        case 60:
            Console.WriteLine("勉強合格!");
            break;
        case 99:
            Console.WriteLine("上帝眷顧!");
            break;
    }

演變2:
    int score = 99;
    switch (score)
    {
        case 0:
            Console.WriteLine("缺考?");
            break;
        case > 0 and <= 30:
            Console.WriteLine("太爛了");
            break;
        case > 30 and < 60:
            Console.WriteLine("還是不行");
            break;
        case >= 60 and < 80:
            Console.WriteLine("還得努力");
            break;
        case >= 80 and < 90:
            Console.WriteLine("秀兒,真優秀");
            break;
        case >= 90 and <= 100:
            Console.WriteLine("不錯,奇蹟");
            break;
    }

演變3:
    public class Order{
        public float Qty {get; set;}
        public string Name {get; set;}
    }
	Order od = new Order{ Qty = 1000f, Name = "黃金" };
	switch(od){
        case {  Qty: > 1000f, Name:"黃金" }:
            Console.WriteLine("真貴!!!");
            break;
    }

演變4:
    public class Order{
        public float Qty {get; set;}
        public string Name {get; set;}
    }
	Order od = new Order{ Qty = 1000f, Name = "黃金" };
    var res = od switch {
        { Qty: > 1000f, Name:"黃金"  } => true,
        _ => false
    };

擴展用法:
    object n = 5000000L;
    if(n is long x)
    {
        Console.WriteLine("它是個長整型,存放的值是:{0}", x);
    }

init

init 只用於只讀屬性的初始化階段,對於可讀可寫的屬性。

最初我們進行屬性初始化
    public class Dog
    {
        public int No { get; } = 0;
        public string Name { get; } = "no name";
        public int Age { get; } = 1;

        public Dog(int no, string name, int age)
        {
            No = no;
            Name = name;
            Age = age;
        }
    }

  => Dog dog = new(1001, "亞亞", 4);

現在
    public class Cat
    {
        public int No { get; init; }
        public string Name { get; init; }
        public int Age { get; init; }
    }

  => Cat cat = new Cat { No = 100, Name = "丫丫", Age = 4 };

只讀屬性初始化結束後不可賦值,故 dog.No = 1; 或 cat.No = 1;都會報錯。
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章