Day 7 - 复盘与下一步
建议用时:120-150 分钟
你将学会什么
- 把 12 周内容整理成一张能力地图
- 判断哪些知识能继续用于设备通信和工业上位机
- 用一个控制台程序复盘已学模块
- 制定下一步项目练习路线
复盘不是写感想。复盘要回答三个问题:学过什么、能拿它做什么、下一步应该用什么项目继续练。
本页固定顺序
- 先学第一部分:弄懂今天最小、最重要的知识,并运行短例子。
- 再学第二部分:把刚学的知识组合成一个完整例子。
- 然后做第三部分:自己跟着敲,再完成重复训练和每日小测。
- 最后做第四部分:先独立完成作业,再用完整答案检查。
学习衔接
上一页学习的是“验收与交付”,今天继续学习“复盘与下一步”。先使用上一页已经会的写法,再只增加今天这个新知识点;如果前置内容还不能独立敲出,先回上一页复习,不要硬跳。
今天的最低通过线
第一次学习不要求背完整页。完成下面 3 项,就可以继续:
- 能用自己的话说明“复盘与下一步”解决什么问题。
- 把第一部分的短例子亲手敲完,并确认每个例子都能运行。
- 不看完整答案完成第三部分至少前 3 个例子,再主动改一个值观察结果。
第一部分:先学原理和最小知识
这一部分只读,不敲代码。
为什么复盘要按能力,而不是按日期
按日期复盘容易变成流水账:
第一天学了变量。
第二天学了判断。
第三天学了循环。这只能说明“看过什么”,不能说明“会用它解决什么问题”。
按能力复盘更有价值:
遇到列表数据,用 List 保存,用 LINQ 搜索和筛选。
遇到保存失败,用 try/catch 捕获异常,用日志记录原因。
遇到界面按钮,用 Command 连接 ViewModel 方法。这样复盘后,知识会变成处理问题的工具。
什么叫真正学会一个知识点
一个知识点是否学会,可以用 4 个问题判断:
| 问题 | 能回答说明什么 |
|---|---|
| 它解决什么问题? | 知道使用场景 |
| 它为什么这样设计? | 理解原理 |
| 最小代码怎么写? | 能落地 |
| 常见错误怎么修? | 能排错 |
比如 async/await:
- 解决什么问题:让耗时操作不阻塞界面。
- 为什么这样设计:等待任务完成时,不让当前线程一直卡住。
- 最小代码怎么写:
await Task.Delay(500); - 常见错误怎么修:没有
await会导致方法提前继续执行。
下一步应该怎么练
继续学习时,不建议马上换很多方向。更稳的路线是:
- 先把 Avalonia 设备管理项目重做一遍。
- Week 13 学字节、十六进制和串口。
- Week 14 学 TCP、UDP、粘包拆包和重连。
- Week 15 学 Modbus RTU / TCP。
- Week 16 学 OPC UA,再继续采集、SQLite、趋势和报警。
这样 C#、Avalonia 和真实设备会自然连起来:
Avalonia 界面 -> ViewModel -> 采集服务 -> 协议驱动 -> 真实设备这条路线能继续复用 C# 基础、面向对象、集合、异常、异步、测试和文档。
第二部分:把知识组合成完整例子
这 12 周不是只学某一个框架,而是按“语言基础 -> 程序结构 -> 数据处理 -> 界面开发 -> 项目交付”逐层展开。
可以整理成 6 层:
| 层级 | 内容 | 能解决什么问题 |
|---|---|---|
| 第 1 层 | 变量、类型、判断、循环、方法 | 能写出最基本的程序流程 |
| 第 2 层 | 类、对象、属性、接口、泛型 | 能把散乱代码整理成结构 |
| 第 3 层 | 集合、LINQ、异常、文件、JSON | 能处理列表、保存数据、处理错误 |
| 第 4 层 | 委托、事件、异步、任务、线程概念 | 能理解按钮点击、后台任务、耗时操作 |
| 第 5 层 | Avalonia、XAML、MVVM、绑定、命令 | 能做桌面端界面 |
| 第 6 层 | 测试、日志、文档、版本、发布、交付 | 能把项目整理成可交付版本 |
这些基础进入上位机后怎么继续使用
| 知识 | 普通桌面端怎么用 | 上位机怎么用 |
|---|---|---|
| 变量和类型 | 保存表单内容 | 保存点位值、质量码和时间 |
| 判断和循环 | 校验输入、遍历列表 | 判断报警、轮询多台设备 |
| 类和接口 | Service、Repository | Device、Tag、IDeviceDriver |
| 集合和 LINQ | 搜索、筛选、排序 | 筛选设备、统计报警和采集值 |
| 异常处理 | 保存失败提示、日志记录 | 通信超时、断线重连、数据库忙 |
| async/await | 后台保存、导入导出 | 串口、TCP、OPC UA 和采集任务 |
| 测试 | 测业务规则和服务层 | 测协议解析、报警规则和采集停止 |
| 文档和发布 | 交付桌面应用 | 设备点表、联调记录和现场诊断 |
结论很直接:C# 基础不是只为普通 Avalonia 页面服务。变量、类型、类、集合、异常、异步和测试,会直接进入通信、采集、报警和历史数据代码。
第三部分:跟着敲代码
今天写一个控制台复盘程序。它不做业务功能,而是把已学模块、能做的事、下一步练习打印出来。
第 1 步:新建控制台项目
dotnet new console -n LearningReview
cd LearningReview第 2 步:替换 Program.cs
把 Program.cs 替换成下面完整代码。
using System;
using System.Collections.Generic;
using System.Linq;
List<SkillItem> skills = new()
{
new(
"C# 基础",
"变量、类型、判断、循环、方法",
"能写输入、处理、输出这条最小流程",
"写一个商品总价计算程序"),
new(
"面向对象",
"类、对象、属性、接口、泛型",
"能把商品、订单、用户这些概念写成清楚的代码结构",
"写 Product、IProductRepository、ProductService"),
new(
"数据处理",
"集合、LINQ、文件、JSON",
"能保存多条数据、搜索数据、把数据写入文件",
"写商品搜索和 JSON 保存"),
new(
"错误处理",
"异常、边界条件、日志",
"能在输入错误、文件失败时给出明确处理",
"写商品校验和保存失败日志"),
new(
"异步和任务",
"async、await、Task、取消操作",
"能处理耗时操作,不让界面卡住",
"写导入 CSV 的后台任务"),
new(
"Avalonia MVVM",
"XAML、Binding、Command、ViewModel",
"能做桌面端列表、表单、按钮操作",
"写商品管理主窗口"),
new(
"项目交付",
"测试、文档、版本、发布、验收",
"能把项目整理成可交付版本",
"写测试、README、发布说明和验收清单")
};
List<NextPractice> practices = new()
{
new(1, "重做设备管理页面", "不看旧代码,重新完成设备新增、编辑、删除、搜索和保存"),
new(2, "学习串口通信", "掌握字节、十六进制、帧边界和 SerialPort"),
new(3, "学习 TCP 与 UDP", "掌握连接、收发、拆包、心跳和重连"),
new(4, "学习 Modbus", "读写线圈和寄存器,处理地址、字序和缩放"),
new(5, "学习 OPC UA", "连接、浏览、读写和订阅设备节点")
};
static void PrintTitle(string title)
{
Console.WriteLine();
Console.WriteLine("==== " + title + " ====");
}
static void PrintSkills(IEnumerable<SkillItem> skills)
{
foreach (SkillItem skill in skills)
{
Console.WriteLine($"模块:{skill.Area}");
Console.WriteLine($"内容:{skill.Content}");
Console.WriteLine($"作用:{skill.Value}");
Console.WriteLine($"练习:{skill.Practice}");
Console.WriteLine();
}
}
static void PrintPractices(IEnumerable<NextPractice> practices)
{
foreach (NextPractice practice in practices.OrderBy(item => item.Order))
{
Console.WriteLine($"{practice.Order}. {practice.Name}");
Console.WriteLine($" 目标:{practice.Goal}");
}
}
PrintTitle("12 周能力复盘");
PrintSkills(skills);
PrintTitle("下一步练习路线");
PrintPractices(practices);
PrintTitle("复盘结论");
Console.WriteLine("如果能独立重做 Avalonia 设备管理项目,并能解释每一层代码放在哪里,就进入 Week 13 的串口与字节学习。");
public sealed record SkillItem(
string Area,
string Content,
string Value,
string Practice);
public sealed record NextPractice(
int Order,
string Name,
string Goal);第 3 步:运行
dotnet run应该能看到:
- 7 个能力模块。
- 5 个下一步练习。
- 一句复盘结论。
第 4 步:看懂这段代码
这段代码复习了很多基础:
| 代码 | 复习点 |
|---|---|
List<SkillItem> | 集合和泛型 |
record | 用类型表达一条固定结构的数据 |
foreach | 循环遍历 |
IEnumerable<SkillItem> | 接口和集合抽象 |
OrderBy | LINQ 排序 |
$"{practice.Order}" | 字符串插值 |
static void PrintSkills(...) | 方法拆分 |
它的重点不是打印文字,而是把“集合、类型、方法、LINQ、输出”串成一个完整程序。
小白重复敲写训练
最后一天不要只看总结,要独立重写三个最小闭环。
训练 1:业务规则
public decimal CalculateTotal(decimal price, int count)
{
if (price < 0 || count < 0)
throw new ArgumentOutOfRangeException();
return price * count;
}训练 2:持久化
string json = JsonSerializer.Serialize(products);
await File.WriteAllTextAsync("products.json", json);训练 3:MVVM 命令
[RelayCommand]
private async Task SaveAsync()
{
await _service.SaveAsync(Products);
StatusMessage = "保存成功";
}关掉整个文档,尝试从空白项目写出“新增一条商品并保存到 JSON”的最小程序。不会的地方再回来查,这就是以后真正开发时的学习方式。
每日小测
做完本页后,用这 5 题检查是否真的掌握。
1. 判断题
本页的目标不是只把代码运行起来,还要能说清楚“为什么这样写”。
答案:对。能运行只是第一步,能解释原理、常用操作和常见错误,才说明本页内容进入了可复用能力。
2. 填空题
本页主题是:复盘与下一步。今天至少要掌握的 3 个点是:
1. 把 12 周内容整理成一张能力地图
2. 判断哪些知识能继续用于桌面端和 Web
3. 用一个控制台程序复盘已学模块答案:以上 3 点必须能用自己的代码跑通,不能只停留在阅读。
3. 流程题
遇到本页相关功能时,先按什么顺序处理?
答案:先看完整例子,确认最终效果;再读原理和名词;然后跟着第三部分从空项目敲代码;最后对照作业答案检查。
4. 找错误题
如果本页代码运行失败,第一步应该做什么?
答案:先看终端或 IDE 里的第一条错误,找到文件名和行号;不要同时改很多地方。再回到本页的“常见错误和修法”表格,对照错误类型逐项排查。
5. 改需求题
在本页完整例子跑通后,至少改一个小需求。
可选改法:
- 改一个字段名称。
- 多加一个校验条件。
- 多输出一行结果。
- 把固定数据改成用户输入。
- 把一次处理改成多条数据处理。
答案标准:修改后能重新运行,并能说明这次修改影响了哪一段逻辑。重点检查:把 12 周内容整理成一张能力地图。
上位机专项练习
课程结束不是上位机学习结束。下一步用同一个项目接入串口、TCP、Modbus、SQLite、趋势图和更多现场设备。
下面 3 个例子都要亲手敲。先运行原代码,再完成每个例子后面的改动任务。
专项例子 1:下一阶段路线
1. SerialPort 串口收发
2. TcpClient TCP 通信
3. Modbus RTU/TCP 协议
4. SQLite 历史数据
5. 趋势图与报警统计
6. 真实设备联调运行结果或界面效果:
路线从通信到数据再到现场联调改动任务: 为每一项安排一个独立小项目。
专项例子 2:真实通信接口
public interface IDeviceClient
{
Task ConnectAsync(CancellationToken token);
Task<ushort[]> ReadRegistersAsync(int address, int count, CancellationToken token);
Task DisconnectAsync();
}运行结果或界面效果:
串口或 Modbus 实现遵守同一通信边界改动任务: 先写 FakeDeviceClient 测试界面。
专项例子 3:毕业项目自评
我能独立完成:
[ ] C# 模型与业务规则
[ ] async/await 与取消
[ ] Avalonia 布局与 MVVM
[ ] 配置、日志、测试与发布
[ ] 上位机项目分层
[ ] 故障定位和验收运行结果或界面效果:
勾选结果决定下一轮复习重点改动任务: 没有勾选的项目回到对应周再敲一遍。
第四部分:作业完整答案
作业要求
写一份 LEARNING_REVIEW.md,把 12 周内容整理成:
- 已经学过的基础能力。
- 能做的项目能力。
- 还需要继续练的方向。
- Week 13-16 学习计划。
完整答案:LEARNING_REVIEW.md
# 12 周学习复盘
## 1. 已经学过的基础能力
### C# 基础
- 变量和类型:能保存名称、价格、库存、状态。
- 判断和循环:能做输入校验、列表遍历、条件分支。
- 方法:能把重复逻辑拆出去。
- 类和对象:能把商品、订单、用户这些业务概念变成代码。
- 接口:能把“怎么保存”从业务逻辑里抽出来。
- 泛型:能使用 `List<T>`、`ObservableCollection<T>`、`IEnumerable<T>`。
### 数据处理
- 集合:能保存多条商品数据。
- LINQ:能搜索、筛选、排序。
- 文件:能读写本地文件。
- JSON:能保存和加载结构化数据。
- CSV:能导入和导出表格数据。
### 程序可靠性
- 异常处理:能处理输入错误、文件失败、保存失败。
- 日志:能记录关键操作和错误原因。
- 测试:能用 xUnit 验证业务规则。
- 边界条件:能处理空值、重复、负数、格式错误。
### 异步和并发基础
- `Task`:能表示一个异步操作。
- `async/await`:能等待耗时操作完成。
- 取消操作:能用取消令牌停止后台任务。
- 线程概念:知道耗时任务不应该卡住界面线程。
## 2. 能做的项目能力
- 能做一个 Avalonia 商品管理桌面应用。
- 能用 MVVM 分离界面和逻辑。
- 能把商品数据保存到 JSON。
- 能做搜索、筛选、编辑、删除。
- 能处理保存失败和输入错误。
- 能写 README、用户手册、排错文档。
- 能生成 Release 发布目录。
- 能写验收清单和交付说明。
## 3. 还需要继续练的方向
- 串口:字节、十六进制、报文、校验和异步收发。
- TCP/UDP:连接、拆包、心跳、超时和重连。
- Modbus:线圈、寄存器、地址、字序和缩放。
- OPC UA:节点、读写、订阅、质量码和证书。
- 采集与数据库:队列、缓存、SQLite 和历史查询。
- 工业功能:趋势、报警、联锁、诊断和现场交付。
## 4. Week 13-16 学习计划
### Week 13:串口与字节
目标:
- 学会 bit、byte 和十六进制。
- 学会编码、大小端和报文边界。
- 使用 SerialPort 异步收发。
- 完成 Avalonia 串口调试助手。
### Week 14:TCP 与 UDP
目标:
- 使用 TcpClient 连接、发送和接收。
- 正确处理粘包和半包。
- 增加心跳、超时和重连。
- 完成 Avalonia 网络调试助手。
### Week 15:Modbus RTU / TCP
目标:
- 读写线圈、离散输入和寄存器。
- 处理地址偏移、大小端和比例。
- 区分 RTU CRC 与 TCP MBAP。
- 完成 Avalonia Modbus 监控器。
### Week 16:OPC UA
目标:
- 连接 OPC UA 测试服务器。
- 浏览节点并保存点位配置。
- 读取、写入和订阅数据。
- 处理质量码、证书和断线重连。正确结果
这份复盘要能回答:
- C# 基础学了哪些。
- Avalonia 项目里用到了哪些。
- 后面做通信和采集还能复用哪些。
- Week 13 应该先敲什么例子。
如果这些问题都能回答,12 周内容就不是零散知识,而是一条能继续往项目里走的路线。