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;)
Reference
- https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-version-history
- https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-6
- https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-7
- https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-7-1
- https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-7-2
- https://docs.microsoft.com/zh-cn/visualstudio/releasenotes/vs2017-relnotes#csharp
- https://github.com/dotnet/csharplang
- https://baike.baidu.com/item/c%23/195147
- https://zh.wikipedia.org/wiki/C♯
C# 发展史的更多相关文章
- Python学习笔记—Python基础1 介绍、发展史、安装、基本语法
第一周学习笔记: 一.Python介绍 1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...
- 微分方程——基本概念和常微分方程的发展史
1.2 基本概念和常微分方程的发展史 自变量.未知函数均为实值的微分方程称为实值微分方程:未知函数取复值或变量及未知函数均取复值时称为复值微分方程.若无特别声明,以下均指实变量的实值微分方程. 1.2 ...
- CSS3_概述、发展史、模块介绍、与浏览器之间的关系
一.CSS3概述和CSS3的发展史: 1.css3概述: CSS3是CSS2的升级版本,3只是版本号,它在CSS2.1的基础上增加了很多强大的新功能. 目前主流浏览器chrome.safari. ...
- 一. JVM发展史,运行时数据区域,四大引用
一.JVM的出现 JVM将字节码解释成不同os下的机器指令,有了jvm,java语言在不同平台上运行时不需要重新编译 虚拟机发展史 (1)Sun Classic classic jvm要么采用纯解释器 ...
- 腾讯qq的发展史
腾讯qq的发展史 即时通信软件的历史并不久远,但是它一诞生,就立即受到网民的喜爱,并风靡全球. 在其发展史上,以色列人功不可没.正是四位以色列籍的年轻人,在1996年7月成立的Mirabilis ...
- 安卓发展史以及安卓和苹果对比PPT
此PPT由我们小组协力完成,介绍了Android的发展史以及android与苹果的一些比较.概述了android发展至今的一系列版本,功能的日益完善,它的强大性,灵活性,公开性使其拥有吸引客服的绝大魅 ...
- Qt 框架的图形性能高(OpenGL上的系统效率高),网络性能低,开发效率高,Quick是可以走硬件加速——Qt中分为好几套图形系统,差不多代表了2D描画的发展史。最经典的软描画系统
-----图形性能部分-----Qt的widgets部分,运行时的图像渲染性能是一般的,因为大部分的界面内容都是Qt自绘,没有走硬件加速,也就是说很多图形内容都是CPU算出来的.但是widgets底层 ...
- JavaScript发展史,与JScript差别,引入方式,数据类型,命名规范,命名推荐,解决命名冲突
文件夹: 1.JavaScript发展史 2.JavaScript与JScript差别 3.JavaScript引入方式 4.JavaScript基本数据类型及布尔值 5.JavaScript命名规范 ...
- jQuery的发展史
jQuery的发展史,你知道吗? 每天多学一点知识,就少写一行代码2006年1月,jQuery的第一个版本面世,至今已经有6年多了(注:这个时间点是截止至出书时间).虽然过了这么久,但它依然以其简洁. ...
- Day2 - Linux发展史
第1章 Linux发展史 1.1 什么是操作系统 操作系统是人与计算机硬件的一个中介. 1.2 操作系统组成 操作系统类似与鸡蛋 蛋壳--------->系统中各种各样的软件 蛋清------- ...
随机推荐
- C++对象模型(三):Program Transformation Semantics (程序转换语义学)
本文是Inside The C++ Object Model Chapter 2 部分的读书笔记.是讨论编译器调用拷贝构造函数时的策略(如何优化以提高效率),侯捷称之为"程序转化的语义学&q ...
- SpriteBuilder中应用智能精灵集之后提示找不到文件的解决
SpriteBuilder中有一个将方便的功能,可以用文件夹中的若干图片生成1张图片;这称之为智能精灵集合(smart sprite sheet).好处是可以一次性的加载图片到显存中去,提升了性能. ...
- 彻底搞清楚 RxJava 是什么东西
其实从rxjava14年出现到现在,我是去年从一个朋友那里听到的,特别是随着现在app项目越来越大,分层越来越不明确的情况下,rxjava出现了,以至于出现了rxandroid.其实如果你了解观察者模 ...
- OC语言(三)
十九.一些规范 import系统自带的用尖括号<>来包含. 发现需求不清晰,一定要先搞明白才去做. 多文件开发,文件名和类名一致 命令行里的做法:(只是编译链接主文件,但是全部编译链接会出 ...
- SpriteBuilder中本地化的局限性
最后,App中的(图片)logo仍然保留在英语格式. 未来SpriteBuilder将计划支持本地化资源文件,但是写作该篇的时候估计还没有实现. 你现在必须使用正规的iOS app的国际化技术来支持本 ...
- Java-GenricServlet
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable { priva ...
- JAVA中重写equals()方法的同时要重写hashcode()方法
object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true:注意:当此方法 ...
- Android模拟器启动不了解决办法
问题描述:Windows2008中的MyEclipse项目在Windows2003中运行时无法启动模拟器. 解决要点:启动模拟器管理工具,在启动中设置属性中不勾选默认尺寸显示. 系统错误如下: [20 ...
- 最大的k个数问题
代码来源: http://blog.csdn.net/v_JULY_v 调整堆为小顶堆的代码片:基本思想就是把孩子节点中大的一个跟父节点交换 void HeapAdjust(int array[], ...
- CUDA版本的OpenCL在windows 7的下编程初步
参考文献: http://blog.csdn.net/neoxmu/article/details/8866928 我安装的是CUDA5.5,代码如下: //#include "stdafx ...