learun开发社区 - 力软.net/java快速开发平台官方论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1889|回复: 4

C#各个版本中的新增特性详解

[复制链接]

6

主题

6

帖子

48

积分

新手上路

Rank: 1

积分
48
发表于 2019-3-1 12:51:48 | 显示全部楼层 |阅读模式
序言
自从2000年初期发布以来,c#编程语言不断的得到改进,使我们能够更加清晰的编写代码,也更加容易维护我们的代码,增强的功能已经从1.0搞到啦7.0甚至7.1,每一次改过都伴随着.NET Framework库的相应支持,也不断的带给我们期待与惊喜。下面我们就对c#一路走到现在,做一个回顾与学习。
C#语言目标与前行
c#的设计目标是有以下几点:
  • 旨在是一种简单,现代,通用的面向对象编程语言。
  • 语言及其实现应该为软件工程原理提供支持,例如强类型检查,数组维度检查,未初始化的变量引用检测以及自动垃圾收集。软件的鲁棒性,耐久性和程序员的生产力很重要。
  • 旨在用于开发适用于分布式环境中部署的软件组件。
  • 便携性对于源代码和程序员非常重要,特别是已经熟悉C和C ++的程序员。
  • 支持国际化是非常重要的。
  • C#适用于为托管和嵌入式系统编写应用程序,从使用复杂的操作系统到非常小的专用功能都非常适用。
  • 虽然C#应用程序在内存和处理能力要求方面是经济的,但是该语言并不打算直接用C或汇编语言直接与性能和尺寸进行竞争。

c#版本

c#版本中添加的功能:
C#2.0
  • 泛型
  • 部分类型
  • 匿名方法
  • 迭代器
  • 可空类型
  • Getter / setter单独可访问性
  • 方法组转换(代表)
  • Co- and Contra-variance for delegates
  • 静态类
  • Delegate inference

C#3.0
  • 隐式类型局部变量
  • 对象和收集初始化器
  • 自动实现的属性
  • 匿名类型
  • 扩展方法
  • 查询表达式
  • Lambda表达式
  • 表达树
  • 部分方法

C#4.0
  • 动态绑定
  • 命名和可选参数
  • Generic co- and contravariance
  • 嵌入式互操作类型(“NoPIA”)

C#5.0
  • 异步方法
  • Caller info attributes

C#6.0
  • Compiler-as-a-service(Roslyn)
  • 将静态类型成员导入命名空间
  • 异常过滤器
  • 在Catch和Finally中使用Await
  • 自动属性初始化器
  • 只读属性的默认值
  • Expression-bodied members
  • Null-conditional operators(空条件运算符,简洁检查)
  • 字符串插值
  • nameof operator
  • 字典初始化器

C#7.0
  • out变量
  • 模式匹配
  • 元组
  • 解构
  • 局部函数
  • 数字分隔符
  • 二进制文字
  • 局部引用和引用返回
  • 扩展异步返回类型
  • 表达式的构造函数和finalizers
  • Expression bodied getters and setters
  • throw表达式

C#7.1
  • Async main
  • 默认表达式

c#7.0新特性详解
在2016年Visual Studio “15” Preview 4发布,c# 7.0便开始浮现,现在vs2017已经发布,c#7.0带给我们的惊喜,我们也该一探究竟啦。
C#7.0增加许多新功能,重点是数据,代码简化和性能上。
Out variables
目前在C#中,使用out参数不像我们想要的那么流畅。在使用out参数调用一个方法之前,首先必须声明变量来传递给它。您也不能使用var它们来声明它们,但需要指定完整的类型。
  1. public void PrintCoordinates(Point p)
  2. {
  3.     int x, y; //必须声明
  4.     p.GetCoordinates(out x, out y);
  5.     WriteLine([        DISCUZ_CODE_0        ]quot;({x}, {y})");
  6. }
复制代码

在c#7中再来看看
  1. public void PrintCoordinates(Point p)
  2. {
  3.     p.GetCoordinates(out int x, out int y);
  4.     WriteLine([        DISCUZ_CODE_1        ]quot;({x}, {y})");
  5. }
复制代码

模式匹配
c#7中
  1. public static void PrintStars(object o)
  2.         {
  3.             if (o is int i) Console.WriteLine(i + 12);
  4.         }
复制代码


以前版本需要转化
  1. public static void PrintStars(object o)
  2.         {
  3.             if (o is int) Console.WriteLine(Convert.ToInt32(o) + 12);
  4.         }
复制代码


Switch statements with patterns 扩展switch语句使用模式匹配
  1. <div class="cnblogs_code_toolbar" style="margin-top: 5px;"><span class="cnblogs_code_copy" style="padding-right: 5px; line-height: 1.5 !important;"><a title="复制代码" style="color: rgb(100, 102, 179); text-decoration-line: underline; border: none !important;"></a><a title="复制代码"><span style="white-space: pre-wrap; color: rgb(0, 0, 0);">public static void PrintStars(object o)</span></a></span></div><pre style="white-space: pre-wrap; font-family: " courier="" new"="" !important;"="">        {
  2.             switch (o)
  3.             {
  4.                 case Print p:
  5.                     break;
  6.                 case int a:
  7.                     break;
  8.                 case String b when b=="123":
  9.                     break;
  10.             }
  11.         }        
  12.     }   
  13.     public class Print
  14.     {
  15.         public string PrintName { get; set; }
  16.         public string MoBanPath { get; set; }
  17.         public int Count { get; set; }
  18.     }</pre>
复制代码


元组(Tuples)
注意:元组依赖于一组基础类型,不包括在预览4中。要使功能正常工作,您可以通过NuGet轻松获取它们:
  • 右键单击解决方案资源管理器中的项目,然后选择“管理NuGet软件包...”
  • 选择“浏览”选项卡,选中“包含预发行”,然后选择“nuget.org”作为“包源”
  • 搜索“System.ValueTuple”并安装它。

  1. <span style="font-weight: normal;">static void Main(string[] args)
  2.         {
  3.             var tuple = (a: 10, b: "123");
  4.             Console.WriteLine([        DISCUZ_CODE_5        ]quot;a:{tuple.a},b:{tuple.b}");
  5.             var result1 = GetS();
  6.             var result = Get();
  7.             Console.WriteLine([        DISCUZ_CODE_5        ]quot;Item1:{result1.Item1},Item2:{result1.Item2},Item3:{result1.Item3}");
  8.             Console.WriteLine([        DISCUZ_CODE_5        ]quot;a:{result.a},b:{result.b},c:{result.c}");
  9.             Console.ReadLine();
  10.         }
  11.         static (string, int, DateTime) GetS()
  12.         {
  13.             return ("abc", 123, DateTime.Now);
  14.         }
  15.         static (string a, int b, DateTime c) Get()
  16.         {
  17.             return (a: "abc", b: 123, c: DateTime.Now);
  18.         }</span>
复制代码

局部函数
简单的说,就是在方法里面写方法然后自己调用。
注意:在预览4中,本地函数必须在调用之前声明。这个限制将被松开,所以一旦他们读取的局部变量被明确地分配,就可以调用这个限制。
  1. static void Main(string[] args)
  2.         {
  3.             Console.WriteLine([        DISCUZ_CODE_6        ]quot;{Get(123)},{Get("abc")},{Get(null)}");
  4.             Console.ReadLine();
  5.         }

  6.         public static string Get(object a)
  7.         {           
  8.             return GetP();
  9.             string GetP()
  10.             {
  11.                 if (a is int v) return v + "";
  12.                 if (a is string b) return b;
  13.                 return "ccc";
  14.             }
  15.         }
复制代码

Literal improvements
C#7.0允许在数字文字中_作为数字分隔符出现:
  1. var d = 123_456;
  2. var x = 0xAB_CD_EF;
复制代码

你可以把它们放在数字之间,以提高可读性。它们对价值没有影响。
另外,C#7.0引入了二进制文字,因此您可以直接指定位模式,而不必以心脏知道十六进制符号。
  1. var b = 0b1010_1011_1100_1101_1110_1111;
复制代码


更多c#7.0的特性
到此,我就不在一个个的上演c#7.0的其他功能啦。如果你想深入其他,仔细阅读下面的文档:
c#6.0新语言功能详解
以下新功能在VS 2015及17中实现并可用。
ADD:新增,Exists:已存在,N/A:对该语言没有意义,No:不适用此版本。
下面我简述几个新功能,剩下的我会把文档连接拿出来自己观摩。
字符串插值
上面的代码中都有体现。
  1. var s = [        DISCUZ_CODE_9        ]quot;{p.Name} is {p.Age} year{{s}} old";
复制代码


字典索引初始化
  1. var numbers = new Dictionary<int, string> {
  2.     [7] = "seven",
  3.     [9] = "nine",
  4.     [13] = "thirteen"
  5. };
复制代码


自动属性初始化
  1. public class Customer
  2. {
  3.     public string First { get; set; } = "Jane";
  4.     public string Last { get; set; } = "Doe";
  5. }
复制代码


using引用静态类
  1. using static System.Console;
  2. using static System.Math;
  3. using static System.DayOfWeek;
  4. class Program
  5. {
  6.     static void Main()
  7.     {
  8.         WriteLine(Sqrt(3*3 + 4*4));
  9.         WriteLine(Friday - Monday);
  10.     }
  11. }
复制代码


更多c#6.0语言新特性
线上代码可执行演示文档连接:http://www.volatileread.com/Wiki/Index?id=1075 效果如下
c#2.0-5.0参考文档c#5.0参考文档
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|learun开发社区 - 力软.net/java快速开发平台官方论坛 ( 沪ICP备14034717号 )

GMT+8, 2021-4-23 07:55 , Processed in 0.168983 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表