• 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;都会报错。
        
    
  • 相关阅读:
    Mysql(二)
    Mysql(一)
    JS图表插件(柱形图、饼状图、折线图)
    如何让Table中的第一列和第二列的值相乘然后赋值给第三列
    js生成验证码并验证
    IIS配置默认文档
    DropDownList如何添加一个空白的选项
    GridView如何合并同类项
    .NET后台如何获取前台HMTL控件的值
    Json数据报错
  • 原文地址:https://www.cnblogs.com/az4215/p/15443210.html
Copyright © 2020-2023  润新知