此写法,使得整个语法更为简洁 。
3.3 元组模式日常开发中,存在算法依赖于多个输入 。使用元组模式,可根据 表示为元组 的多个值进行切换 。
// 游戏“rock, paper, scissors(石头剪刀布)”的切换表达式public static string RockPaperScissors(string first, string second)=> (first, second) switch{("rock", "paper") => "rock is covered by paper. Paper wins.",("rock", "scissors") => "rock breaks scissors. Rock wins.",("paper", "rock") => "paper covers rock. Paper wins.",("paper", "scissors") => "paper is cut by scissors. Scissors wins.",("scissors", "rock") => "scissors is broken by rock. Rock wins.",("scissors", "paper") => "scissors cuts paper. Scissors wins.",(_, _) => "tie" // 此处弃元 表示平局(石头剪刀布游戏)的三种组合或其他文本输入};
3.4 位置模式某些类型包含 Deconstruct
方法,该方法将其属性解构为离散变量 。如果可以访问 Deconstruct
方法,就可以使用位置模式检查对象的属性并将这些属性用于模式 。
// 位于象限中的 点对象public class Point{public int X { get; }public int Y { get; }public Point(int x, int y) => (X, Y) = (x, y);public void Deconstruct(out int x, out int y) => (x, y) = (X, Y);}public enum Quadrant// 象限{Unknown, Origin, One, Two, Three, Four, OnBorder}// 下面的方法使用位置模式来提取 x 和 y 的值 。然后 , 它使用 when 子句来确定该点的 Quadrantstatic Quadrant GetQuadrant(Point point) => point switch{(0, 0) => Quadrant.Origin,var (x, y) when x > 0 && y > 0 => Quadrant.One,var (x, y) when x < 0 && y > 0 => Quadrant.Two,var (x, y) when x < 0 && y < 0 => Quadrant.Three,var (x, y) when x > 0 && y < 0 => Quadrant.Four,var (_, _) => Quadrant.OnBorder,// 当 x 或 y 为 0(但不是两者同时为 0)时,前一个开关中的弃元模式匹配_ => Quadrant.Unknown};
如果没有在 switch 表达式中涵盖所有可能的情况 , 编译器将生成一个警告 。
四、using 声明using 声明是前面带 using
关键字的变量声明 。它指示编译器声明的变量应在封闭范围的末尾进行处理 。
static int WriteLinesToFile(IEnumerable<string> lines){using var file = new System.IO.StreamWriter("WriteLines2.txt");int skippedLines = 0;foreach (string line in lines){if (!line.Contains("Second"))file.WriteLine(line);elseskippedLines++;}return skippedLines;// 当代码运行到此位置时,file 被销毁// 相当于 using (var file = new System.IO.StreamWriter("WriteLines2.txt")){ ... }}
如果 using
语句中的表达式不可用,编译器将生成一个错误 。
五、静态本地函数在C# 8.0
中可以向本地函数添加 static
修饰符 , 以确保本地函数不会从封闭范围捕获(引用)任何变量 。若引用了就会生成报错:CS8421
-“静态本地函数不能包含对 <variable> 的引用” 。
// 本地方法 LocalFunction 访问了方法 M() 这个封闭空间的变量 y// 因此,不能用 static 修饰符来声明int M(){int y;LocalFunction();return y;void LocalFunction() => y = 0;}
// Add 方法可以是静态的,因为它不访问封闭范围内的任何变量int M(){int y = 5;int x = 7;return Add(x, y);static int Add(int left, int right) => left + right;}
六、可处置的 ref 结构用 ref
修饰符声明的 struct
可能无法实现任何接口,也包括接口 IDisposable
。
class Program{static void Main(string[] args){using (var book = new Book())Console.WriteLine("Hello World!");}}// 错误写法// Error CS8343 'Book': ref structs cannot implement interfacesref struct Book : IDisposable{public void Dispose(){}}// 正确写法class Program{static void Main(string[] args){// 根据 using 新特性,简洁的写法,默认在当前代码块结束前销毁对象 bookusing var book = new Book();// ...}}ref struct Book{public void Dispose(){}}
因此,若要能够处理 ref struct
,就必须有一个可访问的 void Dispose()
方法 。
此功能同样适用于 readonly ref struct
声明 。
七、可为空引用类型若要指示一个变量可能为 null,必须在类型名称后面附加 ?
,以将该变量声明为可为空引用类型 。否则都被视为不可为空引用类型 。
【C# 8.0 添加和增强的功能【基础篇】】对于不可为空引用类型,编译器使用流分析来确保在声明时将本地变量初始化为非 Null 值 。字段必须在构造过程中初始化 。如果没有通过调用任何可用的构造函数或通过初始化表达式来设置变量,编译器将生成警告 。
推荐阅读
- 在FreeSQL中实现「触发器」和软删除功能
- 小米12x和小米12pro区别-小米12x和小米12屏幕一样吗
- 华为手环6和华为fit哪个好_华为手环6和华为fit对比
- 小米civi和荣耀50pro区别对比_哪款更值得买
- 中国标准的青年和中年的年龄段分别是多少 中国青年年龄
- s20 fe 5g和s20区别_三星s20 fe 5g和三星s20区别
- 华为智慧屏s65和v65区别是什么_华为智慧屏s65和v65电视对比
- 微信怎样通过添加好友申请(微信发送添加好友申请)
- 用微信账号怎么添加好友(微信怎么查自己主动添加好友记录)
- 如何添加微信好友(微信加满5000好友技巧)