C# 语言特性发展史

Intro

本文主要总结介绍C# 每个版本带来的不同的语言特性。

C#,读作C Sharp,是微软推出的一种基于.NET平台的、面向对象的高级编程语言。是微软公司在2000年发布的一种新的编程语言,主要由安德斯·海尔斯伯格(Anders Hejlsberg)主持开发,它是第一个面向组件的编程语言,其源码会编译成msil再运行。它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,并且新增了许多功能及语法糖。

C# 1.x

自 2000 年 C#1.0 发布之后,微软在2003年4月又发布了 C# 1.1 主要是修复BUG,这里统称为1.x

  • 面向对象
  • 内存自动回收,GC
  • 属性
  • 反射

C# 2

  • 泛型
  • 分部类
  • 静态类型
  • 迭代器(yield return)
  • 匿名方法(lambda 表达式)
  • 可空类型
  • 委托的协变逆变
  • 属性访问器可以被单独设置访问级别
  • ??表达式

C# 3

  • Linq
  • 类型初始化器
  • 集合初始化器
  • 匿名类型
  • 局部变量类型推断(var)
  • Lambda 表达式
  • 自动属性
  • 扩展方法
  • 分部方法
  • 表达式树(Expression Tree)

C# 4

  • 动态编程(dynamic
  • 具名参数与可选参数
  • 泛型的协变和逆变
  • TPL任务并行库,基于Task的异步编程

C# 5

  • 异步编程(async&await)
  • 调用方信息特性(CallerMemberName&CallerFilePath&CallerLineNumber)

C# 6

  • 静态导入(using static

  • 异常过滤器(when(ex.ExceptionCode == 111)

  • 属性初始化器(public int PageIndex {get;} = 1;

  • 字典初始化器

    private Dictionary<int, string> webErrors = new Dictionary<int, string>
    {
    [404] = "Page not Found",
    [302] = "Page moved, but left a forwarding address.",
    [500] = "The web server can't come out to play today."
    };
  • 字符串插值($"abc{123}def"

  • nameof 运算符

  • null判断传播运算符(a?SomeProperty?.Abc??"abcd"

  • 表达式体方法(int Add(int a,int b) => a+b;

  • catch和finally子句中支持 await

  • 只读自动属性(public int Count {get;}

C# 7

  • out 变量(int.TryParse("123", out var num);

  • 优化元祖支持,支持变量名((int max,int min) top = (3,1);

  • 废弃变量(if(int.TryParse("123",out _))

  • 模式匹配(if(abc is int num)switch...case支持模式匹配)

  • ref local and ref return(ref return 123;

  • 本地方法(局部方法)

  • 更多的支持表达式体方法(增加支持属性和索引器上实现构造函数、终结器以及 get 和 set 访问器)

  • throw表达式

  • 数字文本语法改进

    误读的数值常量可能使第一次阅读代码时更难理解。 当这些数字被用作位掩码或其他符号而非数字值时,通常会发生这种情况。 C# 7.0 包括两项新功能,使得更容易以最可读的方式写入数字来用于预期用途:二进制文本和数字分隔符

    public const int Sixteen =   0b0001_0000;
    public const int ThirtyTwo = 0b0010_0000;
    public const int SixtyFour = 0b0100_0000;
    public const int OneHundredTwentyEight = 0b1000_0000; public const long BillionsAndBillions = 100_000_000_000; public const double AvogadroConstant = 6.022_140_857_747_474e23;
    public const decimal GoldenRatio = 1.618_033_988_749_894_848_204_586_834_365_638_117_720_309_179M;

C# 7.1

  • 异步Main方法(async Main()

  • 默认常值表达式(Func<string, bool> whereClause = default;

  • 推断元组元素名称

    // C# 7
    int count = 5;
    string label = "Colors used in the map";
    var pair = (count: count, label: label); // C# 7.1
    int count = 5;
    string label = "Colors used in the map";
    var pair = (count, label); // element names are "count" and "label"

C# 7.2

  • 语言版本选择(支持在项目中指定要使用的C#版本)

  • 数值文字中的前导下划线

    C# 7.0 中实现了对数字分隔符的支持,但这不允许文字值的第一个字符是 _。 十六进制文本和二进制文件现可以 _ 开头。

    int binaryValue = 0b_0101_0101;
  • private protected 访问修饰符(可通过包含同一程序集中声明的类或派生类来访问成员)

C# 7.3(Preview)

  • 元组支持相等性比较

  • 新的泛型约束(Enum,Delegate,unmanaged)

  • Ref 局部变量重新分配(Ref 局部变量和 ref 参数现在可通过 ref 分配运算符重新分配 = ref

  • Stackalloc 初始化表达式

    Span<int> x = stackalloc[] { 1, 2, 3 };
  • 初始化表达式和查询中的表达式变量

  • 支持字段的特性

    允许自动实现的属性上的 [field: …] 特性定位其支持字段

    // C# 7.3
    [Serializable]
    public class Foo {
    [field: NonSerialized]
    public string MySecret { get; set; }
    } // above code equals the code below
    [Serializable]
    public class Foo {
    [NonSerialized]
    private string MySecret_backingField; public string MySecret {
    get { return MySecret_backingField; }
    set { MySecret_backingField = value; }
    }
    }

C# 8(Preview)

  • 可空引用类型(引用类型默认不可为空,如果需要为可空则需要显示声明string? abc = null;

Reference

C# 发展史的更多相关文章

  1. Python学习笔记—Python基础1 介绍、发展史、安装、基本语法

    第一周学习笔记: 一.Python介绍      1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  2. 微分方程——基本概念和常微分方程的发展史

    1.2 基本概念和常微分方程的发展史 自变量.未知函数均为实值的微分方程称为实值微分方程:未知函数取复值或变量及未知函数均取复值时称为复值微分方程.若无特别声明,以下均指实变量的实值微分方程. 1.2 ...

  3. CSS3_概述、发展史、模块介绍、与浏览器之间的关系

    一.CSS3概述和CSS3的发展史: 1.css3概述: CSS3是CSS2的升级版本,3只是版本号,它在CSS2.1的基础上增加了很多强大的新功能.    目前主流浏览器chrome.safari. ...

  4. 一. JVM发展史,运行时数据区域,四大引用

    一.JVM的出现 JVM将字节码解释成不同os下的机器指令,有了jvm,java语言在不同平台上运行时不需要重新编译 虚拟机发展史 (1)Sun Classic classic jvm要么采用纯解释器 ...

  5. 腾讯qq的发展史

    腾讯qq的发展史 即时通信软件的历史并不久远,但是它一诞生,就立即受到网民的喜爱,并风靡全球.    在其发展史上,以色列人功不可没.正是四位以色列籍的年轻人,在1996年7月成立的Mirabilis ...

  6. 安卓发展史以及安卓和苹果对比PPT

    此PPT由我们小组协力完成,介绍了Android的发展史以及android与苹果的一些比较.概述了android发展至今的一系列版本,功能的日益完善,它的强大性,灵活性,公开性使其拥有吸引客服的绝大魅 ...

  7. Qt 框架的图形性能高(OpenGL上的系统效率高),网络性能低,开发效率高,Quick是可以走硬件加速——Qt中分为好几套图形系统,差不多代表了2D描画的发展史。最经典的软描画系统

    -----图形性能部分-----Qt的widgets部分,运行时的图像渲染性能是一般的,因为大部分的界面内容都是Qt自绘,没有走硬件加速,也就是说很多图形内容都是CPU算出来的.但是widgets底层 ...

  8. JavaScript发展史,与JScript差别,引入方式,数据类型,命名规范,命名推荐,解决命名冲突

    文件夹: 1.JavaScript发展史 2.JavaScript与JScript差别 3.JavaScript引入方式 4.JavaScript基本数据类型及布尔值 5.JavaScript命名规范 ...

  9. jQuery的发展史

    jQuery的发展史,你知道吗? 每天多学一点知识,就少写一行代码2006年1月,jQuery的第一个版本面世,至今已经有6年多了(注:这个时间点是截止至出书时间).虽然过了这么久,但它依然以其简洁. ...

  10. Day2 - Linux发展史

    第1章 Linux发展史 1.1 什么是操作系统 操作系统是人与计算机硬件的一个中介. 1.2 操作系统组成 操作系统类似与鸡蛋 蛋壳--------->系统中各种各样的软件 蛋清------- ...

随机推荐

  1. Android官方技术文档翻译——Gradle 插件用户指南(4)

    最近赶项目,白天基本没时间,只有晚上在家的时候才能看一看.昨天晚上只翻译完了第四章,今天就只发第四章吧. 本文译自Android官方技术文档<Gradle Plugin User Guide&g ...

  2. webService详解(一)

    [sql] 什么是webService  WebService,顾名思义就是基于Web的服务.它使用Web(HTTP)方式,接收和响应外部系统的某种请求.从而实现远程调用.   1:从WebServi ...

  3. OpenCV轮廓检测,计算物体旋转角度

    效果还是有点问题的,希望大家共同探讨一下 // FindRotation-angle.cpp : 定义控制台应用程序的入口点. // // findContours.cpp : 定义控制台应用程序的入 ...

  4. iOS中UITableView分割线左侧顶齐

    iOS 7开始UITableView的分割线不在从左侧边界开始了,而是默认空出了一段距离. 如果想要使用默认的分割线而且还要从左侧边界开始的话,有几种解决方式: 1.在tableView的代理方法中设 ...

  5. Cocos2D中的ObjectAL简介

    Cocos2D包含ObjectAL音频库,可以回放音效和音乐. ObjectAL是一个建立在低级别OpenAL API上的库.OpenAL最擅长被用来播放短的音效(.wav,.caf,.aiff),并 ...

  6. Unix/Linux中的grep命令(转)

    本文转载自:如何使用Unix/Linux grep命令——磨刀不误砍柴工系列.该博文条理很清晰. grep简介 grep在一个或多个文件中查找与模式字符串(pattern)匹配的行,并将搜索的结果打印 ...

  7. LeetCode之“链表”:Linked List Cycle && Linked List Cycle II

    1.Linked List Cycle 题目链接 题目要求: Given a linked list, determine if it has a cycle in it. Follow up: Ca ...

  8. nexus安装

    nexus 快速安装指南 1)下载 nexus-2.9.2-01-bundle.zip 地址: http://www.sonatype.org/nexus/ 2)解压 redhat服务器:/opt下面 ...

  9. SharePoint 自定义列表页面定制续—[保存模板后不能正常使用]

    背景:SharePoint列表的四个基本页样式不是特别的好,所以很多情况都需要重新定制,然而经过定制后,又发生了新的问题,就是存成模板,再建新的列表的时候,定制的页面不能正常显示了. 1. 定制后的页 ...

  10. 简单开发Apple Watch的步骤

    好久没写博客了,自己这两年自从孩子出世,也慢慢懈怠了.实在有点对不住了,换了个新公司,也有点时间可以写写东西了.  前几天苹果刚刚发布Apple Watch,Xcode6也更新了watchKit,正好 ...