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