• 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();
  • 相关阅读:
    webapi 导入CSV文件
    webapi 导出CSV文件
    .net 压缩文件夹和解压
    SSH免密码登陆以及穿越跳板机
    hbase shell删除键不听使唤
    百度分享插件wbuid属性无法@指定微博
    iOS safari BUG 总结
    论zeroclipboard的各种爽翻天用法
    Android Studio 使用技巧
    安装第三方包web.py发生的错误
  • 原文地址:https://www.cnblogs.com/shadoll/p/14026040.html
Copyright © 2020-2023  润新知