Skip to Content
Week 12Day 7 - 复盘与下一步

Day 7 - 复盘与下一步

建议用时:120-150 分钟

你将学会什么

  • 把 12 周内容整理成一张能力地图
  • 判断哪些知识能继续用于设备通信和工业上位机
  • 用一个控制台程序复盘已学模块
  • 制定下一步项目练习路线

复盘不是写感想。复盘要回答三个问题:学过什么、能拿它做什么、下一步应该用什么项目继续练。

本页固定顺序

  1. 先学第一部分:弄懂今天最小、最重要的知识,并运行短例子。
  2. 再学第二部分:把刚学的知识组合成一个完整例子。
  3. 然后做第三部分:自己跟着敲,再完成重复训练和每日小测。
  4. 最后做第四部分:先独立完成作业,再用完整答案检查。

学习衔接

上一页学习的是“验收与交付”,今天继续学习“复盘与下一步”。先使用上一页已经会的写法,再只增加今天这个新知识点;如果前置内容还不能独立敲出,先回上一页复习,不要硬跳。

今天的最低通过线

第一次学习不要求背完整页。完成下面 3 项,就可以继续:

  • 能用自己的话说明“复盘与下一步”解决什么问题。
  • 把第一部分的短例子亲手敲完,并确认每个例子都能运行。
  • 不看完整答案完成第三部分至少前 3 个例子,再主动改一个值观察结果。

第一部分:先学原理和最小知识

这一部分只读,不敲代码。

为什么复盘要按能力,而不是按日期

按日期复盘容易变成流水账:

第一天学了变量。 第二天学了判断。 第三天学了循环。

这只能说明“看过什么”,不能说明“会用它解决什么问题”。

按能力复盘更有价值:

遇到列表数据,用 List 保存,用 LINQ 搜索和筛选。 遇到保存失败,用 try/catch 捕获异常,用日志记录原因。 遇到界面按钮,用 Command 连接 ViewModel 方法。

这样复盘后,知识会变成处理问题的工具。

什么叫真正学会一个知识点

一个知识点是否学会,可以用 4 个问题判断:

问题能回答说明什么
它解决什么问题?知道使用场景
它为什么这样设计?理解原理
最小代码怎么写?能落地
常见错误怎么修?能排错

比如 async/await

  • 解决什么问题:让耗时操作不阻塞界面。
  • 为什么这样设计:等待任务完成时,不让当前线程一直卡住。
  • 最小代码怎么写:await Task.Delay(500);
  • 常见错误怎么修:没有 await 会导致方法提前继续执行。

下一步应该怎么练

继续学习时,不建议马上换很多方向。更稳的路线是:

  1. 先把 Avalonia 设备管理项目重做一遍。
  2. Week 13 学字节、十六进制和串口。
  3. Week 14 学 TCP、UDP、粘包拆包和重连。
  4. Week 15 学 Modbus RTU / TCP。
  5. Week 16 学 OPC UA,再继续采集、SQLite、趋势和报警。

这样 C#、Avalonia 和真实设备会自然连起来:

Avalonia 界面 -> ViewModel -> 采集服务 -> 协议驱动 -> 真实设备

这条路线能继续复用 C# 基础、面向对象、集合、异常、异步、测试和文档。

第二部分:把知识组合成完整例子

这 12 周不是只学某一个框架,而是按“语言基础 -> 程序结构 -> 数据处理 -> 界面开发 -> 项目交付”逐层展开。

可以整理成 6 层:

层级内容能解决什么问题
第 1 层变量、类型、判断、循环、方法能写出最基本的程序流程
第 2 层类、对象、属性、接口、泛型能把散乱代码整理成结构
第 3 层集合、LINQ、异常、文件、JSON能处理列表、保存数据、处理错误
第 4 层委托、事件、异步、任务、线程概念能理解按钮点击、后台任务、耗时操作
第 5 层Avalonia、XAML、MVVM、绑定、命令能做桌面端界面
第 6 层测试、日志、文档、版本、发布、交付能把项目整理成可交付版本

这些基础进入上位机后怎么继续使用

知识普通桌面端怎么用上位机怎么用
变量和类型保存表单内容保存点位值、质量码和时间
判断和循环校验输入、遍历列表判断报警、轮询多台设备
类和接口Service、RepositoryDevice、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>接口和集合抽象
OrderByLINQ 排序
$"{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 周内容就不是零散知识,而是一条能继续往项目里走的路线。