-
C#7.0新特性
out变量
可以直接在方法中使用out申明变量 int.TryParse("123", out var result);
元组
元组的申明
var alphaBetaStart = (alpha: "a", beta: "b"); Console.WriteLine($"{alphaBetaStart.alpha}{alphaBetaStart.beta}");
解构与元组
private class User { public string Name { get; } = "Bob"; public string Email { get; } = "129120@qq.com"; public int Age { get; set; } = 25; //解构 public void Deconstruct(out string name, out string email) { (name, email) = (Name, Email); } } //解构元组 var u = new User(); var (name, email) = u; Console.WriteLine($"{name}{email}");
弃元
//弃元 var (_, email2) = u; Console.WriteLine($"{email2}");
使用_代替了解构的返回值name
模式匹配
什么是模式匹配
官方文档的定义是:模式匹配是一种可让你对除对象类型以外的属性实现方法分派的功能;简而言之对于某一个抽象对象的抽象方法,他不同的子类有不同实现,现在我们也可以对属性使用is关键字进行类别判断进行不同的操作
if (input is int i) { Console.WriteLine($"{i}是int类型"); } else if (input is string j) { Console.WriteLine($"{j}是string类型"); } private object input = "123";
switch匹配模式
上面例子是is的模式匹配,使用switch可以编写更加复杂的模式匹配
var nus = new List<int> { 1, 2, 3, 4, 5, -1, -8, -10 }; var sequence = new List<object> { 0, -10, -20, 10, new User(), 20, "book", "doom", "time", nus }; //switch的模式匹配 foreach (var content in sequence) { var sum = 0; switch (content) { case 0: Console.WriteLine("0"); break; case IEnumerable<int> child: { foreach (var item in child) sum += item < 0 ? item : 0; Console.WriteLine($"child:{sum}"); break; } case int n when n > 0: Console.WriteLine($"n:{n}"); break; case string s when s.Contains("oo"): Console.WriteLine($"s:{s}"); break; default: Console.WriteLine("default"); break; } }
Ref 局部变量和返回结果
对于引用类型A,若将A赋值给B(B=A),改变B的值则A也会改变。而对于值类型(如int),若将D赋值给C,改变C的值D值不变。现在使用ref关键字可以完成改变C导致D的值改变
int x = 10; ref var num = ref x;//使用ref将x的赋值给num,虽然是struct但是改变num也会改变x,反之亦然,相当于num和x是引用类型 num = 9;
此时输出x,则其值为9
也可在方法中使用
public ref int RefVariable(int[,] matrix) { for (var i = 0; i < 3; i++) { for (var j = 0; j < 3; j++) { if (matrix[i, j] % 2 == 0) { return ref matrix[i, j]; } } } throw new InvalidOperationException("Not found"); }
此时如果改变返回值,matrix表示的二维数组该对象值也会改变
本地函数(局部函数)
public IEnumerable<int> LocalFunction(int min,int max) { if(min < 0 || min > 10) throw new ArgumentException("min范围是0到10"); if (max < 0 || max > 10) throw new ArgumentException("max范围是0到10"); if(min > max) throw new ArgumentException("max必须不小于min"); return Get24(); IEnumerable<int> Get24() { for (int i = min; i < max; i++) { if (i == 2 || i == 4) yield return i; } } }
属性表达式
private string _name; public string Name { get => _name; set => _name = value ?? string.Empty; }
通用的异步返回类型
/// <summary> /// 使用ValueTask代替引用类型的Task /// </summary> /// <returns></returns> private async ValueTask<int> Func() { await Task.Delay(10); return 5; }
数字文本语法改进与默认文本表达式
数字文本语法改进
/// <summary> /// 数字文本语法改进0b开头表示二进制_分割方便阅读,不影响数值 /// </summary> public void NumberText() { int a = 0b0001_0001; int b = 100_100; }
默认文本表达式
/// <summary> /// 默认文本表达式 /// </summary> public Func<string, bool> Func1 { get; set; } = default;
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式