# C# 期末复习知识点总结

> 来源：复习课录音整理  
> **考试时间：7号（第7天）下午第1场 2:00**  
> **核心章节：第2章（基础语法）+ 第4章（类和对象）| 第5章（继承和多态）考大题**

---

## 一、考试基本信息

| 项目 | 内容 |
|------|------|
| 考试日期 | **7号** |
| 考试时间 | 下午 **2:00** 第1场 |
| 核心范围 | 第2章（基本语法）、第4章（类和对象）→ **最核心** |
| 次重点 | 第5章（继承和多态）→ 大题居多 |
| 了解即可 | 第3章（字符串和类）、第6章（异常处理+文件操作，考得少） |

### 考试题型

- **选择题** — 表达式求值、运算符优先级、基本概念
- **判断题** — 理论判断（记住特性即可答）
- **程序填空 / 改错** — 给一段代码，填缺失部分或改错
- **编程题（30分）** — **重点大题**，三套题：
  1. 基础语法题（类似C语言的常规题）
  2. 数组操作题
  3. **面向对象编程题** — 创建类、创建对象、调用方法计算面积

---

## 二、面向对象三大基石（三大基本特征）

> **三大基本特征：封装、继承、多态** —— **必记！**

### 1. 封装（Encapsulation）

核心：将行为和属性包装在类中，对外只提供接口，隐藏内部实现。

#### 创建类

```csharp
class Shape
{
    // 字段、属性、方法
}
```

- **类名 + 花括号**，基本结构写出来就能得分
- 不确定访问修饰符时**不要写**，写了反而容易错

#### 类的三大核心成员

| 成员 | 说明 |
|------|------|
| **字段（Field）** | 存储数据的变量 |
| **属性（Property）** | 类似字段，但有 `get` / `set`，控制读写 |
| **方法（Method）** | 定义行为 |

#### 属性（Property）的写法

```csharp
private double length;
public double Length
{
    get { return length; }   // 读
    set { length = value; }  // 写
}
```

- `get` → 返回值（return）
- `set` → 赋值（value 关键字）

#### 访问修饰符（重点！必记作用域）

| 修饰符 | 作用域 |
|--------|--------|
| **public** | 最大，任何类均可访问 |
| **private** | 仅本类可访问 |
| **protected** | 本类 + 子类可访问 |
| **internal** | 同一程序集内可访问 |

> **记住前三者的权限范围！**  
> 访问修饰符写在**最前面**。

---

### 2. 继承（Inheritance）

- 使用 **冒号 `:`** 表示继承

```csharp
class Circle : Shape
{
    // Circle 继承 Shape
}
```

---

### 3. 多态（Polymorphism）

> **多态基于继承** —— 一定是两个类有继承关系才能重写

两种实现方式：

#### 方式一：虚方法 + 重写

```csharp
// 父类
class Shape
{
    public virtual double GetArea()  // virtual 关键字
    {
        return 0;
    }
}

// 子类
class Circle : Shape
{
    public override double GetArea()  // override 关键字
    {
        return Math.PI * radius * radius;
    }
}
```

- 父类方法加 **`virtual`**
- 子类方法加 **`override`**

#### 方式二：抽象类 + 抽象方法重写

```csharp
// 抽象类
abstract class Shape
{
    public abstract double GetArea();  // 抽象方法，无方法体
}

// 子类
class Circle : Shape
{
    public override double GetArea()
    {
        return Math.PI * radius * radius;
    }
}
```

- 抽象方法**只能在抽象类中**
- 子类必须 **`override`** 实现

---

## 三、构造函数（Constructor）⭐ 重点

### 定义条件（三句话，背下来！）

1. **方法名与类名相同**
2. **方法名前没有返回值声明（连 void 都没有）**
3. **方法体中不能使用 `return` 语句返回值**

```csharp
class Shape
{
    // 构造函数
    public Shape()
    {
        // 初始化代码
    }

    // 构造函数重载（不同参数）
    public Shape(double r)
    {
        radius = r;
    }
}
```

### 默认构造函数

- 每个类都有默认的无参构造函数
- 若自己写了构造函数，默认构造函数被覆盖

### 构造函数重载

- 同一个类可以有多个构造函数
- **参数个数不同 或 参数类型不同**

---

## 四、析构函数（Destructor）

- 对象脱离作用域时自动执行，释放内存
- 写法：构造函数名前加 **波浪线 `~`**

```csharp
~Shape()
{
    // 清理代码
}
```

- 每个类有默认析构函数，不用手动写

---

## 五、方法重载（Method Overloading）⭐ 重点

### 定义

> C# 允许使用**同一方法名**定义多个方法，区别在于**参数的个数或参数类型不同**

### 属于重载的情况

```csharp
// 基准方法
public double GetArea(double r)                  // 一个参数

// ✅ 参数类型不同
public double GetArea(int r)

// ✅ 参数个数不同
public double GetArea(double width, double height)

// ✅ 参数个数和类型都不同
public double GetArea(int width, int height)
```

### ❌ 不属于重载的情况

- **只有返回类型不同**，参数列表相同 → **不算重载！**

```csharp
// ❌ 这样不算重载，编译错误
public double GetArea(int r) { ... }
public int GetArea(int r) { ... }     // 错误！
```

> **重载只区别于参数（个数或类型），与返回值无关！**

---

## 六、字段默认值

| 数据类型 | 默认值 |
|----------|--------|
| 整数（int） | `0` |
| 浮点数（float/double） | `0.0` |
| 字符串（string） | `null` |
| 字符（char） | `'\0'` |
| 布尔（bool） | `false` |

> 如果不给字段赋初值，系统会给默认值（参考课本 81 页表 4.1）

---

## 七、创建对象

```csharp
Shape s1 = new Shape();
```

**步骤：**
1. 写**类名**
2. 写**对象名**
3. `=` **`new`** 关键字
4. 调用**构造函数**（与类同名 + 小括号）

> 访问成员用 **`.` 点运算符**：`s1.GetArea()`

---

## 八、异常处理（了解即可）

```csharp
try
{
    // 可能出错的代码
}
catch (Exception ex)
{
    // 处理异常
}
finally
{
    // 无论是否异常都会执行
}
```

---

## 九、文件操作（了解即可）

### 常用类

- **`FileStream`** — 读写**字节数据**
- **`File`** 类

### 命名空间

- 文件操作：`System.IO`
- 使用 `FileStream` 时必须引入：`using System.IO;`

### 常见判断题

> "多态基于继承" ✅  
> "静态方法可重写" ❌ → 静态方法**不能重写**

---

## 十、老师叮嘱（考试技巧）⭐

### 1. 编程题不要空着！

- 先把基本结构写上：
  ```csharp
  using System;
  class Program
  {
      static void Main(string[] args)
      {
          // ...
      }
  }
  ```
- 写上就能得分，空着没法给分

### 2. 不确定的访问修饰符不要写

- 写字段、方法时，不确认是 public/private 就**不写**，写了反而扣分

### 3. 仔细读题

- 看清楚题目让用**虚方法**重写还是**抽象方法**重写

### 4. 改错题技巧

- 常见的错误类型：
  - 数组越界：`i < length` 写成 `i <= length`
  - 变量未赋初值（如 `sum`、`average`）
  - 类型不匹配：`int / int` 结果赋给 `double`（不会自动转小数）
  - 命名错误

### 5. 选择题技巧

- **运算符优先级** — 用于表达式求值（如 `a / b` 等）
- **区间判断**写法
- 实在不会的题，按常识去推也能答出来

### 6. 判断题技巧

- 理论判断，记住各特征的定义就能答

### 7. 禁止作弊！

- 不要抄、不要作弊 → 影响学位证
- 正常写，老师会尽量给分让你及格

### 8. 答题时间

- **不要提前交卷**——做满至少1小时，认真检查

### 9. 复习资料

- 老师已上传复习PPT到在线平台，**下载下来看**
- 复习PPT中的程序案例（求素数、求模、求1到某数的和等）
- 上节课上机出的题也看一遍

### 10. 作业

- 还有未交作业的同学尽快补交
- 老师会逐一批阅，不要随便糊弄

---

## 十一、考试重点层级总览

| 优先级 | 内容 | 原因 |
|--------|------|------|
| ⭐⭐⭐ | **第2章：基本语法** | 基础，贯穿所有题型 |
| ⭐⭐⭐ | **第4章：类和对象** | 创建类、创建对象、构造函数、方法重载 — **核心考点** |
| ⭐⭐ | **第5章：继承和多态** | 大题居多，虚方法/抽象方法重写 |
| ⭐ | 异常处理 + 文件操作 | 考得少，了解即可 |
| ⭐ | 第3章：字符串和类 | 了解即可 |

### 最后的编程大题（30分）

大概率是：
1. **创建类**（如 Shape）
2. 创建**虚方法/抽象方法**计算面积
3. 创建**子类**继承并重写
4. **创建对象**，调用方法输出结果

---

> *祝考试顺利！能写的一定要写，别空着！*
