本章内容主要探讨了.NET平台和C#编程中的值类型和引用类型在方法参数传递中的差异,以及静态方法的使用。在.NET框架中,公共语言运行时(CLR)是其核心组件之一,而结构属于值类型,类属于引用类型。在类的设计中,属性是用于封装类内部数据的重要机制,可以设置访问器以确保数据安全。
值类型和引用类型的传递:
在C#中,参数的传递有两种方式:值传递和引用传递。值类型(如结构)是按值传递的,这意味着当一个值类型变量作为参数传递给方法时,方法得到的是该变量的一个副本。任何对副本的修改都不会影响原始变量。然而,引用类型(如类)是按引用传递的,方法接收的是对象引用的副本,而不是对象本身。因此,如果在方法中通过这个引用修改对象的状态,原始对象也会受到影响。
案例分析:
在描述的代码示例中,`SE` 类的实例 `zhang` 的 `Popularity` 属性被传递给了 `Vote` 方法。由于 `SE` 是一个引用类型,`Vote` 方法中的 `se` 参数实际上是 `zhang` 引用的副本。在 `Vote` 方法中,`se.Popularity++` 的操作会修改原始 `zhang` 对象的状态,导致 `zhang` 的 `SayHi()` 方法在消息框中显示更新后的人气值。
静态方法:
静态方法是属于类的方法,不依赖于类的实例,可以直接通过类名调用。它们不具有`this`关键字,不能访问非静态成员。在需要解决与特定对象实例无关的问题时,静态方法是合适的工具。例如,实现一个计算两个数字之和的函数,无需创建一个数学类的实例,可以直接定义为静态方法。
本章任务:
1. 使用Visio绘制基本类图:这要求掌握UML类图的基本元素和表示法,如类、接口、关联、继承等。
2. 实现项目经理给员工评分功能:这涉及类的设计,可能需要创建`Employee`和`ProjectManager`类,实现评分方法。
3. 实现给新购计算机编号:可能需要创建一个`Computer`类,并设计一个自动分配序列号的静态方法。
4. 实现投票器,选举最佳员工:需要创建`Employee`类,设计投票和计票的逻辑,可能还需要使用到集合和排序算法。
复习与预习:
复习类和对象的概念,以及类的属性(包括只读、只写、带有验证逻辑的属性)。预习结构的特性,理解值类型和引用类型作为参数时的行为差异,以及何时应该使用静态方法。
自动属性:
C#中的自动属性允许简化属性的声明,编译器会自动为私有字段和访问器生成代码。这种特性在不需要自定义逻辑或访问控制时,能减少代码冗余。例如,`public string Name { get; set; }` 将自动生成一个私有字段和对应的get、set访问器。
封装:
封装是面向对象编程的三大特征之一,它通过访问修饰符(如public、private)来限制对类内部数据的访问,保护数据不受非法修改,提高代码的可维护性和安全性。通过属性,我们可以更好地控制类的内部状态,实现数据的隐藏和安全访问。