前 22 讲的简要总结

23什么是类? - 图1
class-declaration:
attributesopt class-modifiersoptpartialopt class identifier type-parameter-listopt
class-baseopt type-parameter-constraints-clausesopt class-body;opt

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

什么是“类”

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

计算机领域的类有下面三个方面

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

是一种数据结构(Data Structure)

类是一种“抽象”的数据结构。

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

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

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

是一种数据类型

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

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

反射与 dynamic 示例

这两个示例也展现了类作为“数据类型”的一面。

反射的基础:

  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. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Student s1 = new Student(1, "Timothy");
  6. Student s2 = new Student(2, "Jacky");
  7. Console.WriteLine(Student.Amount);
  8. }
  9. }
  10. class Student
  11. {
  12. // 3. Amount 代表现实世界中学生的个数
  13. public static int Amount { get; set; }
  14. static Student()
  15. {
  16. Amount = 100;
  17. }
  18. public Student(int id, string name)
  19. {
  20. ID = id;
  21. Name = name;
  22. Amount++;
  23. }
  24. ~Student()
  25. {
  26. Amount--;
  27. }
  28. ...
  29. }

构造器与析构器

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. // 使用默认构造器
  6. //Student stu = new Student();
  7. // 一旦自定义构造器,上述语句会产生报错,因此输出下述语句
  8. Student stu = new Student(1, "Timothy");
  9. stu.Report();
  10. }
  11. }
  12. class Student
  13. {
  14. // 自定义构造器的名字必须与类名一致
  15. //构造器快速生成:ctor+enter
  16. public Student(int id, string name)
  17. {
  18. this.ID = id;
  19. this.Name = name;
  20. }
  21. ~Student()//析构器,释放占用内存
  22. {
  23. Console.WriteLine("Bye bye! Release the system resources ...");
  24. }
  25. public int ID { get; set; }
  26. public string Name { get; set; }
  27. public void Report()
  28. {
  29. Console.WriteLine($"I'm #{ID} student, my name is {Name}.");
  30. }
  31. }

23什么是类? - 图2