C#各个版本中的新增特性详解【转】
序言
自从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
默认表达式
参考文档:https://en.wikipedia.org/wiki/C_Sharp_(programming_language)#cite_note-roslyn_6-47
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它们来声明它们,但需要指定完整的类型。
public void PrintCoordinates(Point p)
{
int x, y; //必须声明
p.GetCoordinates(out x, out y);
WriteLine($"({x}, {y})");
}
在c#7中再来看看
public void PrintCoordinates(Point p)
{
p.GetCoordinates(out int x, out int y);
WriteLine($"({x}, {y})");
}
模式匹配
c#7中
public static void PrintStars(object o)
{
if (o is int i)
Console.WriteLine(i + 12);
}
以前版本需要转化
public static void PrintStars(object o)
{
if (o is int) Console.WriteLine(Convert.ToInt32(o) + 12);
}
Switch statements with patterns 扩展switch语句使用模式匹配
public static void PrintStars(object o)
{
switch (o)
{
case Print p:
break;
case int a:
break;
case String b when b=="123":
break;
}
}
}
public class Print
{
public string PrintName { get; set; }
public string MoBanPath { get; set; }
public int Count { get; set; }
}
元组(Tuples)
注意:元组依赖于一组基础类型,不包括在预览4中。要使功能正常工作,您可以通过NuGet轻松获取它们:
右键单击解决方案资源管理器中的项目,然后选择“管理NuGet软件包...”
选择“浏览”选项卡,选中“包含预发行”,然后选择“nuget.org”作为“包源”
搜索“System.ValueTuple”并安装它。
static void Main(string[] args)
{
var tuple = (a: 10, b: "123");
Console.WriteLine($"a:{tuple.a},b:{tuple.b}");
var result1 = GetS();
var result = Get();
Console.WriteLine($"Item1:{result1.Item1},Item2:{result1.Item2},Item3:{result1.Item3}");
Console.WriteLine($"a:{result.a},b:{result.b},c:{result.c}");
Console.ReadLine();
}
static (string, int, DateTime) GetS()
{
return ("abc", 123, DateTime.Now);
}
static (string a, int b, DateTime c) Get()
{
return (a: "abc", b: 123, c: DateTime.Now);
}
部函数
简单的说,就是在方法里面写方法然后自己调用。
static void Main(string[] args)
{
Console.WriteLine($"{Get(123)},{Get("abc")},{Get(null)}");
Console.ReadLine();
} public static string Get(object a)
{
return GetP();
string GetP()
{
if (a is int v) return v + "";
if (a is string b) return b;
return "ccc";
}
}
Literal improvements
C#7.0允许在数字文字中_作为数字分隔符出现:
var d = 123_456;
var x = 0xAB_CD_EF;
你可以把它们放在数字之间,以提高可读性。它们对价值没有影响。
另外,C#7.0引入了二进制文字,因此您可以直接指定位模式,而不必以心脏知道十六进制符号。
var b = 0b1010_1011_1100_1101_1110_1111;
更多c#7.0的特性
到此,我就不在一个个的上演c#7.0的其他功能啦。如果你想深入其他,仔细阅读下面的文档:
请参考文档:https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/
c#6.0新语言功能详解
以下新功能在VS 2015及17中实现并可用。
ADD:新增,Exists:已存在,N/A:对该语言没有意义,No:不适用此版本。
下面我简述几个新功能,剩下的我会把文档连接拿出来自己观摩。
字符串插值
上面的代码中都有体现。
var s = $"{p.Name} is {p.Age} year{{s}} old";
字典索引初始化
var numbers = new Dictionary<int, string> {
[7] = "seven",
[9] = "nine",
[13] = "thirteen"
};
自动属性初始化
public class Customer
{
public string First { get; set; } = "Jane";
public string Last { get; set; } = "Doe";
}
using引用静态类
using static System.Console;
using static System.Math;
using static System.DayOfWeek;
class Program
{
static void Main()
{
WriteLine(Sqrt(3*3 + 4*4));
WriteLine(Friday - Monday);
}
}
更多c#6.0语言新特性
线上代码可执行演示文档连接:http://www.volatileread.com/Wiki/Index?id=1075 效果如下
参考文档:https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6
c#2.0-5.0参考文档
c#5.0参考文档
c#4.0参考文档
连接地址:https://msdn.microsoft.com/en-us/magazine/ff796223.aspx
c#3.0参考文档
连接地址:https://msdn.microsoft.com/en-us/library/bb308966.aspx
c#2.0参考文档
连接地址:https://msdn.microsoft.com/en-us/library/7cz8t42e(v=vs.80).aspx
原文地址:http://www.cnblogs.com/knowledgesea/p/6694979.html
C#各个版本中的新增特性详解【转】的更多相关文章
- C#各个版本中的新增特性详解
序言 自从2000年初期发布以来,c#编程语言不断的得到改进,使我们能够更加清晰的编写代码,也更加容易维护我们的代码,增强的功能已经从1.0搞到啦7.0甚至7.1,每一次改过都伴随着.NET Fram ...
- 【PHP系列】PHP 7.0新增特性详解
开始介绍PHP7.0新特性,具体的可以参照官网的介绍,我来挑一些给大家详细讲解下 http://php.net/manual/en/migration70.new-features.php 1. ?? ...
- MySQL 8.0新增特性详解【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- PHP 7.0新增特性详解
https://www.cnblogs.com/riverdubu/archive/2017/03/22/6434705.html 开始介绍PHP7.0新特性,具体的可以参照官网的介绍,我来挑一些给大 ...
- CSS3新增特性详解(二)
上篇博文主要介绍了CSS3新增特性中的静态特性,比如新的选择器.多背景图.阴影.渐变等.本文主要介绍CSS3中新增的动态特性,如过度.动画.变形等. transitian: -webkit-tran ...
- CSS3新增特性详解(一)
注:由于CSS3的新特性较多,所以分两篇博文来说明.第一篇主要包括新的选择器.文字及块阴影.多背景图.颜色渐变.圆角等.第二篇主要细说CSS3的各种动画效果,如:旋转.移动.缩放等,还包括图标字体的应 ...
- C#中的 特性 详解(转载)
本篇幅转载于:http://www.cnblogs.com/rohelm/archive/2012/04/19/2456088.html C#中特性详解 特性提供了功能强大的方法,用于将元数据或声明信 ...
- ES6,ES2105核心功能一览,js新特性详解
ES6,ES2105核心功能一览,js新特性详解 过去几年 JavaScript 发生了很大的变化.ES6(ECMAScript 6.ES2105)是 JavaScript 语言的新标准,2015 年 ...
- Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验
Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...
随机推荐
- Hessian实例
简述Hessian Hessian是一个由Caucho Technology开发的轻量级RPC框架,由于它使用二进制RPC协议,所以它更快.更简单,很适合于发送二进制数据(访问官网): 在进行基于He ...
- caffe.bin caffe的框架
最近打算看一看caffe实现的源码,因为发现好多工作都是基于改动网络来实现自己的的目的.比如变更目标函数以及网络结构,以实现图片风格转化或者达到更好的效果. 深度学习框架 https://mp.wei ...
- Android local socket学习总结
转载请注明出处: http://blog.csdn.net/xiexh0921/article/details/7513628 ################################## ...
- Windows下获取Dump文件以及进程下各线程调用栈的方法总结(转)
1. Dump文件的用途 Dump文件, 主要用于诊断一个进程的运行状态,尤其是碰到崩溃(Crash)或者挂起(hang)不响应时,需要分析它的工作状态. 除了平时常见的attach到这个进程, 分 ...
- 立即执行函数与Function
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 与new Function()区别? new Function() 还是有区别的,fn = ne ...
- UDP协议总结
我们已经讲解了物理层.连接层和网络层.最开始的连接层协议种类繁多(Ethernet.Wifi.ARP等等).到了网络层,我们只剩下一个IP协议(IPv4和IPv6是替代关系).进入到传输层(trans ...
- CorelDRAW简单绘制的一杯满满的橙汁教程
CorelDRAW怎么画一杯橙汁?方法很简单,首先绘制一个闭合路径,执行线性渐变,填充颜色:复制图形,使用刻刀工具裁剪两半,更改不透明度:然后为橙汁增加底部椭圆:修剪橙子片:绘制吸管:最后加上一层橙子 ...
- Ubuntu_18.04安装网易云音乐
首先到网易云音乐官网下载网易云音乐,ubuntu版的,安装. 这时候的图标打不开,缺少libcanberra sudo apt install libcanberra-gtk-module 安装完了配 ...
- [USACO17JAN] Subsequence Reversal序列反转 (dfs+记忆化)
题目大意:给你一个序列,你可以翻转任意一段子序列一次,求最长不下降子序列长度 tips:子序列可以不连续,但不能破坏在原序列中的顺序 观察数据范围,n<=50,很小,考虑dfs *dfs来跑区间 ...
- Linux系统串口接收数据编
http://blog.csdn.net/bg2bkk/article/details/8668576 之前基于IBM deveplopworks社区的代码,做了串口初始化和发送的程序,今天在此基础上 ...