C#历代版本新特性——面试题常用

掌握一门语言,当然要掌握它的特性,而随着C#历代版本的迭代更替,C#语言也日趋完善,在C#2.0~C#4.0版本所带来的新的语法特性格外重要。C#的新特性,其本质都是“语法糖”,目的是提升开发效率,在编译时会被编译器转成原始语法。下面按照版本顺序依次介绍其中在日常开发中比较常用的部分。

C# 1.0 特性 第1个版本,编程语言最基础的特性。 Classes:面向对象特性,支持类类型 Structs:结构 Interfaces:接口 Events:事件 Properties:属性,类的成员,提供访问字段的灵活方法 Delegates:委托,一种引用类型,表示对具有特定参数列表和返回类型的方法的引用 Expressions,Statements,Operators:表达式、语句、操作符 Attributes:特性,为程序代码添加元数据或声明性信息,运行时,通过反射可以访问特性信息 Literals:字面值(或理解为常量值),区别常量,常量是和变量相对的

C#2.0新特性

泛型及其相关,匿名方法

泛型

2.0版本的C#语言和公共语言运行时(CLR)中增加了泛型。泛型将类型参数的概念引入.NET Framework,类型参数允许类和方法将一个或多个类型的指定延迟到和护短代码声明并实例化该类或方法的时候。

public class List<T> { }

其中,T就是System.Collections.Generic.List<T>实例所存储类型的占位符。当定义泛型类的实例时,必须指定这个实例所存储的实际类型:

List<string> lst = new List<string>();

泛型允许将一个实际的数据类型规约延迟至泛型的实例被创建时才确定。

泛型主要由两个优点:

  • 编译时可以保证类型安全。
  • 不用做类型转换,获得一定的性能提升。

泛型方法,泛型委托,泛型接口

除了泛型类之外,还可以使用泛型方法,泛型委托,泛型接口

//泛型委托
public delegate void Del<T>(T item);
public static void Notify(int i) { }
Del<int> ml = new Del<int>(Notify);

//泛型接口
public class MyClass<T1, T2, T3> : MyInteface<T1, T2, T3> { public T1 Method1(T2 param1, T3 param2){throw new NotImplementedException(); } }
interface MyInteface<T1, T2, T3> { T1 Method1(T2 param1, T3 param2); }

//泛型方法
static void Swap<T>(ref T t1, ref T t2){ T temp = t1;t1 = t2;t2 = temp; }
public void Interactive()
{
    string str1 = "a"; string str2 = "b";
    Swap<string>(ref str1, ref str2);
    Console.WriteLine(str1 + "," + str2);
}

匿名方法

匿名方法的实质其实就是委托,函数式编成的最大特点之一就是吧方法作为参数和返回值。匿名方法可以省略参数,编译时会自动为这个方法按照委托签名的参数添加。

public delegate void ConsoleWrite(string strMsg);
//匿名方法
ConsoleWrite delCW1 = new ConsoleWrite(WriteMsg);
delCW1("lalalala");
ConsoleWrite delCw2 = delegate (string strMsg)
{
    Console.WriteLine(strMsg);
};
delCW2("ruaruarua");

Iterators:迭代器 Nullable types:可以为Null的类型,该类可以是其它值或者null Getter/setter separate accessibility:属性访问控制 Method group conversions (delegates):方法组转换,可以将声明委托代表一组方法,隐式调用 Co- and Contra-variance for delegates and interfaces:委托、接口的协变和逆变 Static classes:静态类 Delegate inference:委托推断,允许将方法名直接赋给委托变量

C#3.0/C#3.5新特性

Implicitly typed local variables: Object and collection initializers:对象和集合初始化器 Auto-Implemented properties:自动属性,自动生成属性方法,声明更简洁 Anonymous types:匿名类型 Extension methods:扩展方法 Query expressions:查询表达式 Lambda expression:Lambda表达式 Expression trees:表达式树,以树形数据结构表示代码,是一种新数据类型 Partial methods:部分方法

C# 4特性 (VS 2010)

Dynamic binding:动态绑定 Named and optional arguments:命名参数和可选参数 Generic co- and contravariance:泛型的协变和逆变 Embedded interop types (“NoPIA”):开启嵌入类型信息,增加引用COM组件程序的中立性

C# 5特性 (VS 2012)

Asynchronous methods:异步方法 Caller info attributes:调用方信息特性,调用时访问调用者的信息

C# 6特征 (VS 2015)

Compiler-as-a-service (Roslyn) Import of static type members into namespace:支持仅导入类中的静态成员 Exception filters:异常过滤器 Await in catch/finally blocks:支持在catch/finally语句块使用await语句 Auto property initializers:自动属性初始化 Default values for getter-only properties:设置只读属性的默认值 Expression-bodied members:支持以表达式为主体的成员方法和只读属性 Null propagator (null-conditional operator, succinct null checking):Null条件操作符 String interpolation:字符串插值,产生特定格式字符串的新方法 nameof operator:nameof操作符,返回方法、属性、变量的名称 Dictionary initializer:字典初始化

C# 7 特征 (Visual Studio 2017)

Out variables:out变量直接声明,例如可以out in parameter Pattern matching:模式匹配,根据对象类型或者其它属性实现方法派发 Tuples:元组 Deconstruction:元组解析 Discards:没有命名的变量,只是占位,后面代码不需要使用其值 Local Functions:局部函数 Binary Literals:二进制字面量 Digit Separators:数字分隔符 Ref returns and locals:引用返回值和局部变量 Generalized async return types:async中使用泛型返回类型 More expression-bodied members:允许构造器、解析器、属性可以使用表达式作为body Throw expressions:Throw可以在表达式中使用

C# 7.1 特征 (Visual Studio 2017 version 15.3)

Async main:在main方法用async方式 Default expressions:引入新的字面值default Reference assemblies: Inferred tuple element names: Pattern-matching with generics:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏风口上的猪的文章

.NET面试题系列[4] - C# 基础知识(2)

面试出现频率:主要考察装箱和拆箱。对于有笔试题的场合也可能会考一些基本的类型转换是否合法。

671
来自专栏lulianqi

理解委托类型

delegate 是一种可用于封装命名或匿名方法的引用类型。(并不是所有的引用类型都是class)

470
来自专栏.NET后端开发

认识XmlReader

摘要 XmlReader类是组成.NET的关键技术之一,极大地方便了开发人员对Xml的操作。通过本文您将对XmlReader有一个很好的认识,并将其应用到实际开...

32610
来自专栏WeaponZhi

高效开发 MVVM 和 databinding 你需要使用的工具

阅读本篇大概需要 11 分钟。 相信不少同学已经开始使用 MVVM 作为自己 Android 开发架构了,但实际上,我在使用过程中查阅资料发现,网上有关 MVV...

3569
来自专栏大内老A

ASP.NET MVC的Model元数据与Model模板:模板的获取与执行策略

当我们调用HtmlHelper或者HtmlHelper<TModel>的模板方法对整个Model或者Model的某个数据成员以某种模式(显示模式或者编辑模式)进...

1726
来自专栏前端学习心得

Vue2.0学习(二)----自定义指令与实例的属性和方法

如果有需要源代码,请猛戳源代码 希望文章给大家些许帮助和启发,麻烦大家在GitHub上面点个赞!!!十分感谢

782
来自专栏.Net Core 开发记录

C#基础篇 - 理解委托和事件

委托类似于C++中的函数指针(一个指向内存位置的指针)。委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针。简单理解,委托是一种可以把函数当做...

643
来自专栏飞扬的花生

Json字符串和Json对象的简单总结

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机...

1756
来自专栏我就是马云飞

BRAVH源码模拟

简介 BRAVH是一个recyclerView的adapter,能够快速适配多种类型adapter,可定制,用的人挺多,下面我们就来分析分析他的源码,模拟来写一...

2009
来自专栏张善友的专栏

深入浅出事件流处理NEsper(二)

NEsper使用的事件类型来描述事件的类型信息。你的应用在启动时可能预先配置定义事件类型,或者在运行时通过API或EPL语法动态的增加事件类型。 EPL中的cr...

18410

扫描关注云+社区