
s 运算符以前是用来匹配类型的上述的用法是它的语法扩展。object n 5000000L; if(n is long) { Console.WriteLine(它是个长整型); }进化之后的 is 运算符也可以这样用object n 5000000L; if(n is long x) { Console.WriteLine(它是个长整型存放的值是{0}, x); }如果你在 if 语句内要使用 n 的值就可以顺便转为 long 类型并赋值给变量 x这样就一步到位不必再去写一句 long x (long)n 。如果 switch... 语句在判断之后需要返回一个值还可以把它变成表达式来用。咱们把前面的 Order 例子改一下。string message od switch { { Qty: 1000f } 发财了, { Qty: 500f } 年度大订单, { Qty: 100f } 订单量不错, _ 未知 }; Console.WriteLine(message);这时候你得注意1switch 现在是表达式不是语句块所以最后大括号右边的分号不能少2因为 switch 成了表达式就不能用 case 子句了所以直接用具体的内容来匹配3最后返回“未知”的那个下划线_也就是所谓的“弃婴”哦不是“弃元”就是虽然赋了值但不需要使用的变量可以直接丢掉。这里就相当于 switch 语句块中的 default 子句当前面所有条件都不能匹配时就返回“未知”。第三出属性的 init 访问器要首先得知道这个 init 只用于只读属性的初始化阶段对于可读可写的属性和以前一样直接 get; set; 即可。有人说这个 init 不知干啥用那好咱们先不说它先来看看 C# 前些版本中新增的属性初始化语句。public class Dog { public int No { get; } 0; public string Name { get; } no name; public int Age { get; } 1; }你看这样就可以给属性分配初始值了那还要 init 干吗呢好我给你制造一个问题——我要是这样初始化 Dog 类的属性你试试看。Dog x new Dog { No 100, Name 吉吉, Age 4 };试一下编译会出错吧。有些情况你可以在属性定义阶段分配初始值但有些时候你必须要在代码中初始化。在过去我们会通过定义带参数的构造函数来解决。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 x new(1001, 吉吉, 4);可是这样做的装逼指数依然不够高你总不能每个类都来这一招吧虽然不怎么辛苦但每个类都得去写一个构造函数不利落。于是init 访问器用得上了咱们把 Dog 类改改。public class Dog { public int No { get; init; } public string Name { get; init; } public int Age { get; init; } }你不用再去写带参数的构造函数了实例化时直接为属性赋值。Dog x new Dog { No 100, Name 吉吉, Age 4 };这样一来这些只读属性都有默认的初始值了。当然这个赋值只在初始化过程中有效初始化之后你再想改属性的值没门x.Name 冬冬; //错误 x.Age 10; //错误