C#语言特性发展史

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;
  • AsyncEnumerable/AsyncStream
  • 默认接口实现
  • 更丰富的模式匹配

Reference

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

推荐阅读更多精彩内容

  • C#新功能 一、C#历史演变 C# 1,Visual Studio .NET 2002: C# 初版。 C# 1....
    165e0c0b59d2阅读 2,543评论 0 3
  • 不支持上传文件,所以就复制过来了。作者信息什么的都没删。对前端基本属于一窍不通,所以没有任何修改,反正用着没问题就...
    全栈在路上阅读 1,948评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • Objective-C[编辑]维基百科,自由的百科全书 Objective-C编程范型面向对象 设计者布莱德·考克...
    半片残枫阅读 1,567评论 0 6
  • 早晨,我乘坐公交车上班。 在我上车时,前面有两位盲人,看上去是夫妇。他们每人手执一根长棍,女人挽着男人都手臂。男人...
    爱阅沈阳阅读 129评论 0 0