一直用C#开发程序,.NET的功能愈来愈多,变化也挺大的,从最初的封闭,到如今的开源,功能不断的增长,一直在进步。做为C#的强烈支持者,C#的变化,我不能不关注,这篇文章主要介绍,C#6.0和C#7.0增长的功能。C#的发展史和.NET之前的版本,请看C#和.NET版本,这边文章中有介绍。html
using static 加强功能可用于导入单个类的静态方法。
例如:using static System.String;能够直接用String类中的静态方法,而不用string.XXXX算法
“异常筛选器”是肯定什么时候执行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"); }
可让属性初始化,仅仅初始化一次,这适用于方法和只读属性
例如:异步
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
Null 条件运算符使 null 检查更轻松、更流畅。 将成员访问 . 替换为 ?.
例如:var first = person?.FirstName; string test = null;string t = test?.ToString();
若是 Person 对象是 null,则将变量 first 赋值为 null,不然,将 FirstName 属性的值分配给该变量。【?.】的左侧使用任何表达式(包括方法调用)async
nameof 表达式的计算结果为符号的名称,简单来讲就是为了显示名称。
例如: string test = "测试"; Console.WriteLine($"{test} , nameof:{nameof(test)}");
结果:测试 , nameof:testide
索引初始值设定项就是对索引初始化,能够像Cat cat = new Cat { Age = 10, Name = "Fluffy" };初始化值同样,只不过如今增长了索引的初始化函数
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"); }); }
如今能够在方法调用的参数列表中声明 out 变量,而不是编写单独的声明语句
例如:学习
if (int.TryParse("123", out int result)) Console.WriteLine(result)
须要包含多个数据元素的简单结构的方法,也不知道怎么解释,总之就是好用。
例如:测试
(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是引用类型
模式匹配 是一种可以让你对除对象类型之外的属性实现方法分派的功能,模式匹配支持 is 表达式和 switch 表达式。每一个表达式都容许检查对象及其属性以肯定该对象是否知足所寻求的模式,使用 when 关键字来指定模式的其余规则。is 表达式的加强功能, 能够针对值类型和引用类型进行测试。简单来讲就是帮你测试类型。
例如:
string test = "123"; if (test is int count) Console.WriteLine(count);
上面的例子会提示int类型的模式没法处理string类型的表达式。
许多类的设计都包括仅从一个位置调用的方法。 这些额外的私有方法使每一个方法保持小且集中。 本地函数使你可以在另外一个方法的上下文内声明方法 。 本地函数使得类的阅读者更容易看到本地方法仅从声明它的上下文中调用。简单来讲就是方法中写方法。
例如:
public static int Test() { int count = Add(12, 10); return count; int Add(int a, int b) { return a + b; } }
此功能容许使用并返回对变量的引用的算法,这些变量在其余位置定义。
例如:
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了,对象中的数组值改变了,这个功能以为要慎用。
一般,在进行元组解构或使用 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
误读的数值常量可能使第一次阅读代码时更难理解。 位掩码或其余符号值容易产生误解。 C# 7.0 包括两项新功能,可用于以最可读的方式写入数字来用于预期用途:二进制文本和数字分隔符 。简单来讲就是能够把数字分割等
例如:
int test = 1_123_21; Console.WriteLine(test); //结果 112321
throw 始终是一个语句。 由于 throw 是一个语句而非表达式,因此在某些 C# 构造中没法使用它。
例如:string test = false ? "" : throw new Exception("必须是字符串,不然报错。");
异步方法返回类型不限于 Task、Task<T> 和 void,能够是ValueTask<int>,可避免在性能上分配 Task。
能够查看 【C#中await/async闲说】,这篇文章对异步性能进行了说明,对ValueTask的使用进行了说明
5. C#中泛型的解释(object,list,var,dynamic的区别)
6. C#中委托
7. C#和.NET版本对比