一直用C#开发程序,.NET的功能越来越多,变化也挺大的,从最初的封闭,到现在的开源,功能不断的增加,一直在进步。作为C#的强烈支持者,C#的变化,我不能不关注,这篇文章主要介绍,C#6.0和C#7.0增加的功能。C#的发展史和.NET以前的版本,请看C#和.NET版本,这边文章中有介绍。

C# 6.0版

1. 静态导入

using static 增强功能可用于导入单个类的静态方法。
例如:using static System.String;可以直接用String类中的静态方法,而不用string.XXXX

2. 异常筛选器

“异常筛选器”是确定何时执行catch中的程序, 如果用于异常筛选器的表达式计算结果为 true,则 catch 子句将对异常执行正常处理,如果表达式计算结果为 false,则将跳过 catch 子句。
例如:e.Message.Contains("test")为true执行,否则不执行

try {
throw new Exception("test");
} catch (Exception e) when (e.Message.Contains("test")) {
Console.WriteLine("ce");
}

3. 只读自动属性、自动属性初始化表达式、Expression bodied 成员、字符串内插

可以让属性初始化,仅仅初始化一次,这适用于方法和只读属性
例如:

public class Class6
{
public string LastName { get; set; }
public string FirstName { get; set; }
public string FullName => $"{FirstName} {LastName}"; public override string ToString() => $"{FirstName},{LastName}";
}
//调用
Class6 test = new Class6();
test.LastName = "jie";
test.FirstName = "hua";
Console.WriteLine($"FullName:{test.FullName}, ToString:{test.ToString()}");
test.LastName = "xiao jie";
Console.WriteLine($"FullName:{test.FullName}, ToString:{test.ToString()}");
//运行结果
//FullName:hua jie, ToString:hua,jie
//FullName:hua xiao jie, ToString:hua,xiao jie

4. Null 传播器

Null 条件运算符使 null 检查更轻松、更流畅。 将成员访问 . 替换为 ?.
例如:var first = person?.FirstName; string test = null;string t = test?.ToString();
如果 Person 对象是 null,则将变量 first 赋值为 null,否则,将 FirstName 属性的值分配给该变量。【?.】的左侧使用任何表达式(包括方法调用)

5. nameof 运算符

nameof 表达式的计算结果为符号的名称,简单来说就是为了显示名称。
例如: string test = "测试"; Console.WriteLine($"{test} , nameof:{nameof(test)}");
结果:测试 , nameof:test

6. 索引初始值设定项

索引初始值设定项就是对索引初始化,可以像Cat cat = new Cat { Age = 10, Name = "Fluffy" };初始化值一样,只不过现在增加了索引的初始化

7. Catch 和 Finally 块中的 Await

C# 5 对于可放置 await 表达式的位置有若干限制。 使用 C# 6,现在可以在 catch 或 finally 表达式中使用 await。
例如:

try
{
throw new Exception("test");
}
catch (Exception e) when (e.Message.Contains("test"))
{
await Task.Run(() => { Console.WriteLine($"await catch"); });
}
finally
{
await Task.Run(() => { Console.WriteLine($"await finally"); });
}

C#7.0

1. Out 变量

现在可以在方法调用的参数列表中声明 out 变量,而不是编写单独的声明语句
例如:

if (int.TryParse("", out int result))
Console.WriteLine(result)

2. 元组

需要包含多个数据元素的简单结构的方法,也不知道怎么解释,总之就是好用。
例如:

(string Name, int Age) user = ("小红", );
Console.WriteLine($"Name:{user.Name}, Age:{user.Age}");
ValueTuple<string, int> valueTuple = new ValueTuple<string, int>("小红", );
//可以和Tuple对比学习
Tuple<string, int> test = new Tuple<string, int>("小红", );
//ValueTuple是值类型,Tuple是引用类型

3. 模式匹配

模式匹配 是一种可让你对除对象类型以外的属性实现方法分派的功能,模式匹配支持 is 表达式和 switch 表达式。每个表达式都允许检查对象及其属性以确定该对象是否满足所寻求的模式,使用 when 关键字来指定模式的其他规则。is 表达式的增强功能, 可以针对值类型和引用类型进行测试。简单来说就是帮你测试类型。
例如:

string test = "";
if (test is int count) Console.WriteLine(count);

上面的例子会提示int类型的模式无法处理string类型的表达式。

4. 本地函数

许多类的设计都包括仅从一个位置调用的方法。 这些额外的私有方法使每个方法保持小且集中。 本地函数使你能够在另一个方法的上下文内声明方法 。 本地函数使得类的阅读者更容易看到本地方法仅从声明它的上下文中调用。简单来说就是方法中写方法。
例如:

public static int Test()
{
int count = Add(, );
return count; int Add(int a, int b)
{
return a + b;
}
}

5. Ref 局部变量和返回结果

此功能允许使用并返回对变量的引用的算法,这些变量在其他位置定义。
例如:

class NumberStore
{
int[] numbers = { , , , , , , , , , }; public ref int FindNumber(int target)
{
for (int ctr = ; ctr < numbers.Length; ctr++)
{
if (numbers[ctr] >= target)
return ref numbers[ctr];
}
return ref numbers[];
} public override string ToString() => string.Join(" ", numbers);
}
var store = new NumberStore();
Console.WriteLine($"Original sequence: {store.ToString()}");
int number = ;
ref var value = ref store.FindNumber(number);
value *= ;
Console.WriteLine($"New sequence: {store.ToString()}");
// The example displays the following output:
// Original sequence: 1 3 7 15 31 63 127 255 511 1023
// New sequence: 1 3 7 15 62 63 127 255 511 1023

31变成62了,对象中的数组值改变了,这个功能觉得要慎用。

6. 弃元

通常,在进行元组解构或使用 out 参数调用方法时,必须定义一个其值无关紧要且你不打算使用的变量。 为处理此情况,C# 增添了对弃元的支持 。 弃元是一个名为 _(下划线字符)的只写变量,可向单个变量赋予要放弃的所有值。 弃元类似于未赋值的变量;不可在代码中使用弃元(赋值语句除外)。简单来说就是放弃不需要的值。
例如:

private static (string, double, int) Test(string name)
{
return (name, 1.234, );
}
//使用
var (name, _, age) = Test("测试");
Console.WriteLine($"测试弃元: Name:{name}, Age:{age}");
//运行结果:测试弃元: Name:测试, Age:20

7. 二进制文本和数字分隔符

误读的数值常量可能使第一次阅读代码时更难理解。 位掩码或其他符号值容易产生误解。 C# 7.0 包括两项新功能,可用于以最可读的方式写入数字来用于预期用途:二进制文本和数字分隔符 。简单来说就是可以把数字分割等
例如:

int test = 1_123_21;
Console.WriteLine(test);
//结果 112321

8. 引发表达式

throw 始终是一个语句。 因为 throw 是一个语句而非表达式,所以在某些 C# 构造中无法使用它。
例如:string test = false ? "" : throw new Exception("必须是字符串,否则报错。");

9. 增加异步返回类型ValueTask

异步方法返回类型不限于 Task、Task<T> 和 void,可以是ValueTask<int>,可避免在性能上分配 Task。
可以查看 【C#中await/async闲说】,这篇文章对异步性能进行了说明,对ValueTask的使用进行了说明

其他的版本的基础功能

1.  C#高级功能(四)扩展方法和索引

2. C#高级功能(三)Action、Func,Tuple

3. C#高级功能(二)LINQ 和Enumerable类

4. C#高级功能(一)Lambda 表达式

5. C#中泛型的解释(object,list,var,dynamic的区别)

6. C#中委托

7. C#和.NET版本对比

C#最新功能(6.0、7.0)的更多相关文章

  1. 【转】如何在Windows+VS2005使用最新静态libcurl 7.35.0获取网页数据,支持HTTPS

    地址: http://blog.csdn.net/hujkay作者:Jekkay Hu(34538980@qq.com)关键词:Windows,curl,ssl,  visual c++ 2005, ...

  2. win7 64bit下最新Apahe2.4.18+php7.0.2+MySQL5.7.10配置

    原文:win7 64bit下最新Apahe2.4.18+php7.0.2+MySQL5.7.10配置 一.说明 以前配置apache+php+mysql都是参考网上的,一般都没有什么问题.最近公司有个 ...

  3. 让盘古分词支持最新的Lucene.Net 3.0.3

    原文:让盘古分词支持最新的Lucene.Net 3.0.3 好多年没升级过的Lucene.Net最近居然升级了,到了3.0.3后接口发生了很大变化,原来好多分词库都不能用了,所以上次我把MMSeg给修 ...

  4. 最新版本express 4.2.0的快速建站--简单举例

    express是Node.js的官方唯一推荐的框架,它扩展了http工具以及一些好用的功能.如此好用的东西,赶紧的安装起来: npm install express -g 新版本的express的命令 ...

  5. 升级cocoapods 0.36.0之后,解决更新的部分依赖库,不是最新版本号的问题

    在升级到cocoapods 0.36.0之后,使用原本podfile配置,在又一次运行pod install之后,一些依赖库的版本号,低于github上的最新版本号.可依照下列配置.指定git,强制使 ...

  6. 最新解决Chrome(版本76.0.3809.100) “请停用以开发者模式运行的扩展程序”的方法

    最新解决Chrome(版本76.0.3809.100) “请停用以开发者模式运行的扩展程序”的方法 最近在远景论坛上发现了最新的解决Chrome浏览器提示:请停用以开发者模式运行的扩展程序的问题.该方 ...

  7. 硕盟SM-T54| TYPE C转HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞

    硕盟SM-T54是一款 TYPE C转HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞,支持四口同时使用,您可以将含有USB 3.1协议的电脑主机,通过此产品连接到具有HDMI或VGA的显 ...

  8. 硕盟SM-T54|type-c转接头HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞接口功能说明

    硕盟SM-T54是一款 TYPE C转HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞,支持四口同时使用,您可以将含有USB 3.1协议的电脑主机,通过此产品连接到具有HDMI或VGA的显 ...

  9. 硕盟type-c转接头HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞

    硕盟SM-T54是一款 TYPE C转HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞,支持四口同时使用,您可以将含有USB 3.1协议的电脑主机,通过此产品连接到具有HDMI或VGA的显 ...

  10. 全网最新的nacos 2.1.0集群多节点部署教程

    原文链接:全网最新的nacos 2.1.0集群多节点部署教程-语雀 基本信息 进度整理中 版本 2.1.0 版本发布日期 2022-04-29 git revision number b5845313 ...

随机推荐

  1. Arcgis api for javascript学习笔记(3.2X版本)-Map图层叠加以及基本操作

    1. 不设置默认底图,第一个图层作为底图,然后叠加另外一个图层 先添加图层1,第一个图层1作为默认底图,然后在图层1上叠加图层2,并设置图层2的透明度为50%. <!DOCTYPE html&g ...

  2. HBase 查找版本

    直接使用hbase shell命令进入shell时间会告诉版本: 进shell后.关键在version命令.能够查看版本: # hbase shell HBase Shell; enter 'help ...

  3. C++中的模板编程

    一,函数模板 1.函数模板的概念 C++中提供了函数模板,所谓函数模板,实际上是建立一个通用函数,其函数的返回值类型和函数的参数类型不具体指定,用一个虚拟的类型来表示.这个通用函数就被称为函数的模板. ...

  4. 在嵌入式程序中QT去掉鼠标指针

    在像arm的QT编程当中,一般都是使用触摸来操作,当是我们运行程序的时候会发现总是有个鼠标箭头在那里,下面介绍种方法将其给去掉.这样就漂亮多了.在main()函数加入 #include <QWS ...

  5. PHP 挖掘 XML 和 HTML 数据

    数据挖掘及其重要性 常用缩略词 API: 应用程序编程接口 CDATA: 字符数据 DOM: 文档对象模式 FTP: 文件传输协议 HTML: 超文本标记语言 HTTP: 超文本传输协议 REST: ...

  6. 我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)

    概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设 ...

  7. OpenCV中基于Haar特征和级联分类器的人脸检测

    使用机器学习的方法进行人脸检测的第一步需要训练人脸分类器,这是一个耗时耗力的过程,需要收集大量的正负样本,并且样本质量的好坏对结果影响巨大,如果样本没有处理好,再优秀的机器学习分类算法都是零. 今年3 ...

  8. java中的switch结构

     switchkeyword的中文意思是开关.转换的意思,switch语句在条件语句中特别适合做一组变量相等的推断,在结构上比if语句要清晰非常多.switch语句的语法格式为:switch(表达式) ...

  9. WPF 将图片进行灰度处理

    原文:WPF 将图片进行灰度处理 处理前:      处理后:   这个功能使用使用了 FormatConvertedBitmap(为BitmapSource提供像素格式转换功能)   代码如下:   ...

  10. C# ToString() 数据格式

    double[] numbers= {1054.32179, -195489100.8377, 1.0437E21, -1.0573e-05}; string[] specifiers = { &qu ...