C#高级特性

1、接口

    接口与抽象基类。抽象类与接口的不同是,抽象类不仅可以定义多态接口还可以定义一些其他的成员以及构造函数。而接口只能包含抽象成员。

  抽象父类创建多态接口,只有派生类才可以。而往往很多情况下非派生类使用相同的多台接口。接口可以被任何层次结构、任何命名空间或程序集的任何类型来实现。接口有较高级别的多态性。

  接口不指定修饰符,因为所有的接口定义都是隐式公共和抽象的。

  接口不能定义字段,可以定义属性、事件、索引器。

4、泛型

非泛型集合存在的问题:

  (1)、非泛型----装箱与拆箱问题

    将值类型表示为引用类型----装箱:显式地将值类型分配给System.Object变量的过程

    反之操作为----------------拆箱:把保存在对象引用中的值转换回栈上的相应值类型。

//定义一个值类型
int myInt=20;
//将此值类型装箱转换为引用类型,即从栈到堆
Object boxedInt = myInt;

//拆箱
int unBoxedInt = (int)boxedInt;

   注:拆箱与强制类型转换不同,拆箱后必须能回到其装箱前的数据类型,若检测到数据类型不符,则               将抛出InvalidCastException异常,为了确保安全,每个拆箱操作都应被包裹在try/catch逻辑中。有一些操       作Object对象的类,如ArrayList,为其增加值类型的元素时,默认会进行隐式转换。再如:WriteLine

   装箱和拆箱一个整数的步骤:

    必须在托管堆上分配一个新对象

    基于栈数据的值必须被转移到新分配的内存位置

    拆箱时,保存在堆对象中的值必须转移回栈

       堆上无用的对象会被回收

  方便的同时这种方式同时带来了堆/栈内存转移而导致性能问题,并且缺乏类型安全。

  (2)、非泛型---类型安全问题

    非泛型集合实现的都是Object类,这样在其中存储的类型安全的,因此可以包含任何类型。

  为了解决这些问题,自.Net 2.0后引入了泛型,System.Collections.Generic类。使用.NET 2.0以上的项目应该放弃使用传统的集合类System.Collections

注意:只有类、结构、接口和委托可以使用泛型,枚举类型则不可以使用。

5、泛型类List<T>

原文地址:https://www.cnblogs.com/kelite/p/3354895.html