目录
第03部分 引用类型
- 引用类型的变量存储对其数据或对象的引用,值类型直接包含其数据;对于引用类型,两种变量可以引用同一对象,因此,对一个变量执行的操作会影响另一个变量所引用的对象。对于值类型,每一个变量都具有其自己的数据副本,对于一个变量执行的操作不会影响另一个变量。
3.1 内置引用类型
- 对象object:所有类型都直接或者间接从object继承。可以将任意类型的值赋值给object对象的变量。
- 字符串string:表示0个或者多个Unicode字符的序列,其类型只存在只读属性,可以通过索引的方式获取其中的字符。重新指定字符串时,实质上时创建了新的字符串对象来保存新的字符序列。
- 委托类型delegate:声明方式和方法签名相似。委托是一种可用于封装命名方法或匿名方法的引用类型。
- 动态类型dynamic:表示变量的使用和对其成员的引用绕过编译时检查,在运行时解析这些操作。行为上和object类似,运行时会转化为object类型变量。
3.2 类class
- 在C#中仅允许单一继承,一个类只能从一个基类继承,但可以有多个类继承单一基类。
- 类是直接在命名空间中声明的,未嵌套的类默认未internal,其类成员是默认私有的。
- 类中可以包括构造函数,常量,字段,终结器,方法,属性,索引器,运算符,事件,委托,类,接口,结构类型,枚举类型。
3.3 接口interface
- 接口定义协议:实现该协议的任何类或结构体必须提供接口中成员的实现,具有一定的限制作用。
- 接口可以在命名空间和类中声明,C#7.3版本下,只能包含抽象方法,属性,索引器,事件。不存在默认实现。不可以加访问修饰符。
- C#8.0后可以包括:常量,运算符,静态构造函数,嵌套类型(静态字段,方法,属性,索引和事件),使用显式接口实现,默认成员是public,可以加访问修饰符。
- 接口不能包含实例字段和状态,静态不可以修饰成员。、
- 接口存在多继承的特性,只能重写继承的第一位父接口方法,且是显式接口实现方法重写。
- 在类中,显式接口实现的方法只能通过接口实例去调用,接口实例只能用子对象替代。自身不可以实例化。
- 接口是解决C#中类可以同时继承多个基类的问题。
3.4 可为null的引用类型
- 在C#8.0之后可以使用可为null的引用类型。