从本节开始深入学习面向对象编程。当前的视频教程是 1.0 版本,针对的是 C# 5.0。
image.png
**

  1. 讲解了 C# 基本元素、基本语法
  2. 把类的成员过了一遍:字段、属性、方法、事件
  3. 在前面其实已经讲过了封装、后面讲继承和多态

面向对象编程:封装、继承、多态

什么是“类”

类是一种数据结构,它可以包含数据成员(常量和字段)、函数成员(方法、属性、事件、索引器、运算符、实例构造函数、静态构造函数和析构函数)以及嵌套类型。类类型支持继承,继承是一种机制,它使派生类可以对基类进行扩展和专用化。 —— 《C# 语言规范》
注:这是在描述类是什么,讲的是类的外延而不是类的内涵。
计算机领域的类有下面三个方面

  • 是一种数据结构(data structure)
  • 是一种数据类型
  • 代表现实世界中的“种类”

    是一种数据结构(Data Structure)

    类是一种“抽象”的数据结构。
    • 类本身是“抽象”的结果,例如把学生抽象为 Student 类
    • 类也是“抽象”结果的载体,Student 类承载着学生的抽象(学生的 ID,学生的行为等)

    这里提到的 data structure 和算法里面的 data structure 略有不同。算法里面的数据结构更多是指集合(List、Dictionary 等)数据类型。

  1. class Program
  2. {
  3. static void Main(string[] args){
  4. // 2. 可以用类声明变量、创建实例
  5. Student stu = new Student{
  6. ID=1,
  7. Name = "Timothy"
  8. };
  9. // 2. 类是实例的模板
  10. Console.WriteLine(stu.ID);
  11. Console.WriteLine(stu.Name);
  12. stu.Report();
  13. }
  14. }
  15. // 1. 类是一种数据结构 2. 类是一种自定义的引用类型
  16. class Student{
  17. // 1. 从现实世界学生抽象出来的属性
  18. public int ID { get; set; }
  19. public string Name { get; set; }
  20. // 1. 从现实世界学生抽象出来的行为
  21. public void Report(){
  22. Console.WriteLine($"I'm #{ID} student, my name is {Name}.");
  23. }
  24. }

是一种数据类型

类是一种引用类型,具体到每一个类都是一个自定义类型:

  1. 可以用类去声明变量
  2. 可以用类去创建实例(把类作为实例的模板)

    反射与 dynamic 示例

    如何不用new操作符创建实例…
    这两个示例也展现了类作为“数据类型”的一面。
    反射的基础:

    1. Type t = typeof(Student);
    2. object o = Activator.CreateInstance(t, 1, "Timothy");
    3. Student stu = o as Student;
    4. Console.WriteLine(stu.Name);

    dynamic 编程:

    1. Type t = typeof(Student);
    2. dynamic stu = Activator.CreateInstance(t, 1, "Timothy");
    3. Console.WriteLine(stu.Name);

    代表现实世界中的“种类”

    程序中的类与哲学、数学中的类有相通的地方。

    构造器与析构器

    (1)构造器 初始化内存中值…
    (2)当在内存中没有任何变量在引用时,GC(垃圾收集器)视其为垃圾内存收回来,收回过程中想要做些什么事的话,就放在析构器中做。 ```csharp class Program{ static void Main(string[] args){

    1. // 使用默认构造器
    2. //Student stu = new Student();
    3. // 一旦有了非默认构造器,系统就不在为我们生成默认构造器
    4. Student stu = new Student(1, "Timothy");
    5. stu.Report();

    } }

class Student{ public Student(int id, string name){ //自定义构造器 ID = id; Name = name; }

  1. ~Student(){ //析构器
  2. Console.WriteLine("Bye bye! Release the system resources ...");
  3. }
  4. public int ID { get; set; }
  5. public string Name { get; set; }
  6. public void Report(){
  7. Console.WriteLine($"I'm #{ID} student, my name is {Name}.");
  8. }

} ``` (16)什么是类? - 图2

静态构造器

只能构造静态成员…
image.pngimage.png
image.png
image.png