C#6.0和C#7.0
一直用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("123", out int result))
Console.WriteLine(result)
2. 元组
需要包含多个数据元素的简单结构的方法,也不知道怎么解释,总之就是好用。
例如:
(string Name, int Age) user = ("小红", 18);
Console.WriteLine($"Name:{user.Name}, Age:{user.Age}");
ValueTuple<string, int> valueTuple = new ValueTuple<string, int>("小红", 18);
//可以和Tuple对比学习
Tuple<string, int> test = new Tuple<string, int>("小红", 18);
//ValueTuple是值类型,Tuple是引用类型
3. 模式匹配
模式匹配 是一种可让你对除对象类型以外的属性实现方法分派的功能,模式匹配支持 is 表达式和 switch 表达式。每个表达式都允许检查对象及其属性以确定该对象是否满足所寻求的模式,使用 when 关键字来指定模式的其他规则。is 表达式的增强功能, 可以针对值类型和引用类型进行测试。简单来说就是帮你测试类型。
例如:
string test = "123";
if (test is int count) Console.WriteLine(count);
上面的例子会提示int类型的模式无法处理string类型的表达式。
4. 本地函数
许多类的设计都包括仅从一个位置调用的方法。 这些额外的私有方法使每个方法保持小且集中。 本地函数使你能够在另一个方法的上下文内声明方法 。 本地函数使得类的阅读者更容易看到本地方法仅从声明它的上下文中调用。简单来说就是方法中写方法。
例如:

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

5. Ref 局部变量和返回结果
此功能允许使用并返回对变量的引用的算法,这些变量在其他位置定义。
例如:

class NumberStore
{
int[] numbers = { 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023 }; public ref int FindNumber(int target)
{
for (int ctr = 0; ctr < numbers.Length; ctr++)
{
if (numbers[ctr] >= target)
return ref numbers[ctr];
}
return ref numbers[0];
} public override string ToString() => string.Join(" ", numbers);
}
var store = new NumberStore();
Console.WriteLine($"Original sequence: {store.ToString()}");
int number = 16;
ref var value = ref store.FindNumber(number);
value *= 2;
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, 20);
}
//使用
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的使用进行了说明
其他的版本的基础功能
5. C#中泛型的解释(object,list,var,dynamic的区别)
6. C#中委托
7. C#和.NET版本对比
C#6.0和C#7.0的更多相关文章
- js正则表达式校验非负浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [转]IIS6.0迁移至IIS7.0
原文地址:http://www.splaybow.com/post/iis-6.0-7.0.html 公司的项目需要迁移到IIS7的目标机器中 在此做记录 原来server 2003系统 迁到2008 ...
- 编译可在Nexus5上运行的CyanogenMod13.0 ROM(基于Android6.0)
编译可在Nexus5上运行的CyanogenMod13.0 ROM (基于Android6.0) 作者:寻禹@阿里聚安全 前言 下文中无特殊说明时CM代表CyanogenMod的缩写. 下文中说的“设 ...
- iis7.0上发布mvc4.0网站
步骤如下: 1.右击需要发布的项目,在弹出的菜单中选择“发布...”选项 2.在“发布web”对话框中进行设置,配置文件名称默认为“配置文件1”可以修改为需要的名字,以便识别,也可以不改.发布方法选择 ...
- IIS6.0添加上.net4.0后,以前的.net系统出现“服务器应用程序不可用”的错误提示解决办法
把VS2010开发的网站.net4.0部署到Windows Server 2003的服务器上去, Windows Server 2003操作系统自带的为IIS 6.0,IIS 6.0一般只支持.NET ...
- Swift 3.0 【Swift 3.0 相较于 Swift 2.2 的变化】
一.编译器和语法变化 函数或方法参数 调用函数或方法时从第一个参数开始就必须指定参数名 在Swift的历史版本中出现过在调用函数时不需要指定任何函数参数(或者从第二个参数开始指定参数名),在调用方法时 ...
- 给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。
分析,是一个dp的题目, 设f[i]表示以i为结尾的最大值,g[i]表示以i结尾的最小值,那么 f[i+1] = max{f[i]*arr[i+1], g[i]*arr[i+1],arr[i+1]} ...
- Elasticsearch5.0.1 + Kibana5.0.1 + IK 5.0.1安装记录
最近工作需要,开始研究ES,当前ES的最新版本为5.0.1,从之前的2.x的版本号一下升级到5.x,主要是之前Elastic的产品版本号因为收购等原因很乱,ES 2.X版本的和Kibana 4.x版本 ...
- Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8)
Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8) 本次演示为升级oracle rac数据库,用GI的psu升级,从11.2.0.4.0升级到11.2.0.4.8 ...
- elasticsearch5.0集群+kibana5.0+head插件插件的安装
elasticsearch5.0集群+kibana5.0+head插件插件的安装 es集群的规划: 两台16核64G内存的服务器: yunva_etl_es1 ip:1.1.1.1 u04es01. ...
随机推荐
- luogu P1382 楼房
二次联通门 : luogu P1382 楼房 /* luogu P1382 楼房 线段树 + 扫描线 + 离散化 正解貌似是堆... MMP...二段式线段树各种错误... 离散化一下横坐标 扫描线扫 ...
- php cookie 操作
创建 cookie <?php setcookie(); ?> 取回 Cookie 的值 <?php // Print a cookie echo $_COOKIE["us ...
- SpringCloud学习整理
参考文档 [1]: Spring Cloud Ribbon负载均衡
- dubbo zookeeper图解入门配置
这次主要是对dubbo 和zookeeper的配置做个记录,以便以后自己忘记了,或者踩的坑再次被踩 快速阅读 zookeerer类似 springcloud中的Eureka都做为注册中心,用srpin ...
- 不建议在for循环中使用”+”进行字符串拼接
https://mp.weixin.qq.com/s/qG6bdhndAip9s-_XM9oP3A 为什么阿里巴巴不建议在for循环中使用”+”进行字符串拼接 互联网后端架构 1周前
- JMeter学习-参数化
JMeter也有像LR中的参数化,本篇就来介绍下JMeter的参数化如何去实现. 参数化:录制脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户 ...
- nginx里面的location 规则匹配
nginx location语法 ~ # 区分大小写的正则匹配 location ~ \.(gif|jpg|png|js|css)$ { #规则D } ~* # 不区分大小写的正则匹配(和~的功能相同 ...
- StringBuider类
特点: 线程不安全的可变字符序列 ; 线程不安全对应的效率高 ; 用法同StringBuffer一致
- requests与urllib.request
requests很明显,在写法上与urllib.request不同,前者多一个 S.导入包时:import requestsimport urllib.requesturllib.request请求模 ...
- lua字符串处理(string库用法)
原文地址http://www.freecls.com/a/2712/f lua的string库是用来处理字符串的,基础函数如下 string.byte(s [, i [, j]]) string.by ...