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();
原文地址:https://www.cnblogs.com/shadoll/p/14026040.html