C#最新功能(6.0、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{thrownewException("test");}catch(Exceptione) when (e.Message.Contains("test")) {    Console.WriteLine("ce");}

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

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

例如:

publicclassClass6{publicstringLastName {get;set; }publicstringFirstName {get;set; }publicstringFullName =>$"{FirstName}{LastName}";publicoverridestringToString()=>$"{FirstName},{LastName}";}//调用Class6 test =newClass6();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{thrownewException("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", outintresult))    Console.WriteLine(result)

2. 元组

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

例如:

(stringName,intAge) user = ("小红",18);Console.WriteLine($"Name:{user.Name}, Age:{user.Age}");

ValueTuple valueTuple =newValueTuple("小红",18);//可以和Tuple对比学习Tuple test =newTuple("小红",18);//ValueTuple是值类型,Tuple是引用类型

3. 模式匹配

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

例如:

string test ="123";if(test isintcount) Console.WriteLine(count);

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

4. 本地函数

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

例如:

publicstaticintTest(){intcount = Add(12,10);returncount;intAdd(inta,intb){returna + b;    }}

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

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

例如:

classNumberStore{int[] numbers = {1,3,7,15,31,63,127,255,511,1023};publicrefintFindNumber(inttarget){for(intctr =0; ctr < numbers.Length; ctr++)        {if(numbers[ctr] >= target)returnrefnumbers[ctr];        }returnrefnumbers[0];    }publicoverridestringToString()=>string.Join(" ", numbers);}varstore =newNumberStore();Console.WriteLine($"Original sequence:{store.ToString()}");intnumber =16;refvarvalue=refstore.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# 增添了对弃元的支持 。 弃元是一个名为 _(下划线字符)的只写变量,可向单个变量赋予要放弃的所有值。 弃元类似于未赋值的变量;不可在代码中使用弃元(赋值语句除外)。简单来说就是放弃不需要的值。

例如:

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

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

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

例如:

inttest =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++学习资源,视频教程、职业规划、面试详解、学习路线、开发工具

每晚8点直播讲解C++编程技术。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • 知识点: 注:int类型默认32位有大小范围 且第一位为符号位 0 为正 1 为负 8.4作业 A:1、风力预警系...
    cGunsNRoses阅读 1,084评论 0 0
  • zy1控制台程序新建控制台应用程序名字命名为:helloworldstatic void Main(string[...
    假装我不帅阅读 372评论 0 0
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,357评论 0 17
  • 1.String与Stringbuilder的区别: String自动分配内存大小,每次往里面写新东西,就会重新分...
    夕望有你阅读 1,035评论 0 0
  • 16.1季氏将伐颛臾。冉有、季路见于孔子曰:“季氏将有事于颛臾。”孔子曰:“求!无乃尔是过与?夫颛臾,昔者先王以为...
    共剪西窗烛阅读 1,719评论 0 0