C# 语言之面向对象编程

封装

封装有时称为面向对象编程的第一支柱或原则。根据封装原则,类或结构可以指定自己的每个成员对外部代码的可访问性。 可以隐藏不得在类或程序集外部使用的方法和变量,以限制编码错误或恶意攻击发生的可能性。

成员

所有方法、字段、常量、属性和事件都必须在类型中进行声明,这些被称为类型的成员C# 没有全局变量或方法,这一点其他某些语言不同。即使是编程的入口点(Main 方法),也必须在类或结构中声明(对于顶级语句的情况,是隐式声明)。

下面列出了所有可以在类、结构或记录中声明的各种成员。

  • 字段
  • 常量
  • 属性
  • 方法
  • 构造函数
  • 事件
  • 终结器
  • 索引器
  • 运算符
  • 嵌套类型

可访问性

一些方法和属性可供类或结构外部的代码(称为“客户端代码”)调用或访问。 另一些方法和属性只能在类或结构本身中使用。请务必限制代码的可访问性,仅供预期的客户端代码进行访问。需要使用以下访问修饰符指定类型及其成员对客户端代码的可访问性:

  • public
  • private
  • protected
  • internal
  • protected internal

可访问性的默认值为 private

继承

类、结构和记录可以继承多个接口。继承自接口意味着类型实现接口中定义的所有方法。

泛型类型

类、结构和记录可以使用一个或多个类型参数进行定义。 客户端代码在创建类型实例时提供类型。 例如,System.Collections.Generic 命名空间中的 List<T> 类就是用一个类型参数进行定义的。 客户端代码创建List<string>List<int> 的实例来指定列表将包含的类型。

静态类型

类(而非结构或记录)可以声明为 static 。 静态类只能包含静态成员,不能使用 new 关键字进行实例化。 在程序加载时,类的一个副本会加载到内存中,而其成员则可通过类名进行访问。 类、结构和记录可以包含静态成员。

嵌套类型

类、结构和记录可以嵌套在其他类、结构和记录中。

分布类型

可以在一个代码文件中定义类、结构或方法的一部分,并在其他代码文件中定义另一部分。

对象初始值设定项

无需显式调用构造函数,即可实例化和初始化类或结构对象和对象集合。

匿名类型

如果不方便或没有必要创建已命名的类(例如,使用无需保留或传递给其他方法的数据结构填充列表时),可以使用匿名类型。

扩展方法

可以单独创建类型(其方法可以调用,就像它们属于原始类型一样)来“扩展”类,而无需创建派生类。

隐式类型的局部变量

在类或结构方法中,可以使用隐式类型指示编译器在编译时确定变量类型。

记录(C#9 新增)

C# 9 引入了 record 类型,可创建此引用类型而不创建类或结构。记录是带有内置行为的类,用于将数据封装在不可变类型中。 记录提供以下功能:

  • 用于创建具有不可变属性的引用类型的简明语法。
  • 值相等性。
  • 两个记录类型的变量在它们的类型和值都相同时,它们是相等的。
  • 记录与类不同,类使用引用相等性,即:如果两个类类- 型的变量引用相同的对象,则它们是相等的。
  • 非破坏性变化的简明语法:使用 with 表达式,可以创建作为现有实例副本的新记录实例,但更改了指定的属性值。
  • 显示的内置格式设置:ToString 方法输出记录类型名称以及公共属性的名称和值。
  • 支持继承,因为记录的本质是类,而不是结构。

以上就是C#语言中,面向对象编程中所用到的一些特性,后续章节会对这些特性做详细介绍。