第1章 C# 要点技术
主程需要把语言特性还原为成本模型:集合的扩容和寻址决定热路径,浮点表示决定比较边界,委托与事件决定调用关系,装箱决定隐藏分配,排序和搜索算法决定规模增长后的上限。
从连载位置与先预测开始
本页对应陆泽西(Jesse Lu)《Unity3D 高级编程之进阶主程》的第1章。该作品是在线技术连载,不是有 ISBN 的正式出版书;原作者旧站已不可作为稳定入口,因此以保存下来的完整文章索引核对章节,并保留原始标题与编号。
主程需要把语言特性还原为成本模型:集合的扩容和寻址决定热路径,浮点表示决定比较边界,委托与事件决定调用关系,装箱决定隐藏分配,排序和搜索算法决定规模增长后的上限。
原连载文章覆盖矩阵
| # | 原文章主题或本页检查点 | 可观察解释 |
|---|---|---|
| 1 | List 底层源码剖析 | 检查连续数组、容量扩张、移动成本和迭代失效。 |
| 2 | Dictionary 底层源码剖析 | 检查哈希、桶、冲突、扩容与键稳定性。 |
| 3 | 浮点数的精度问题 | 用误差界和量级说明二进制浮点比较。 |
| 4 | 委托、事件、装箱、拆箱 | 区分调用契约与值类型进入对象接口时的隐藏分配。 |
| 5 | 排序算法 | 按稳定性、时间复杂度与内存成本选择实现。 |
| 6 | 搜索算法 | 先声明数据是否有序、是否可索引,再选择线性或二分等方法。 |
List 底层源码剖析、Dictionary 底层源码剖析、浮点数的精度问题、委托、事件、装箱、拆箱、排序算法、搜索算法 不是随意补充的主程知识清单,而是沿“声明数据规模 → 读取源码路径 → 建立成本模型 → 构造边界输入 → 采集分配耗时 → 签发语言约束”建立因果关系。每个条目都要能定位到实验输入、首个状态变化和最终门禁。
核心模型与技术边界
主程需要把语言特性还原为成本模型:集合的扩容和寻址决定热路径,浮点表示决定比较边界,委托与事件决定调用关系,装箱决定隐藏分配,排序和搜索算法决定规模增长后的上限。
连载写作年代与今天的 Unity、.NET 后端和渲染管线存在差异。复现时保留作者要解释的机制,同时记录旧 API、当前替代路径、运行时版本和验证结果。没有版本映射的“更新版结论”不能覆盖原文章,也不能把今天的默认行为倒推成当年的事实。
必须在本页留下输入、内部状态和输出证据,不能只作为术语出现。
必须在本页留下输入、内部状态和输出证据,不能只作为术语出现。
必须在本页留下输入、内部状态和输出证据,不能只作为术语出现。
必须在本页留下输入、内部状态和输出证据,不能只作为术语出现。
必须在本页留下输入、内部状态和输出证据,不能只作为术语出现。
六阶段主程证据链
可复现实验
对相同数据分别使用预分配 List、逐步扩容 List 和装箱接口,固定运行次数并记录容量、分配与耗时;再用临界浮点值验证相等判断和排序顺序。
最小实现只暴露本章关键状态,不把因果藏进通用框架。
using System;
using System.Collections.Generic;
static bool NearlyEqual(float a, float b, float epsilon)
{
return Math.Abs(a - b) <= epsilon * Math.Max(1f, Math.Max(Math.Abs(a), Math.Abs(b)));
}
var values = new List<int>(capacity: 4096);统一证据契约把结构、版本和故障计划放在同一结果中。
type LeadProgramEvidence = {
chapter: "u3ap-01-csharp-key-techniques";
runtimeVersion: string;
sample: "baseline" | "boundary" | "failure";
stages: readonly string[];
firstDeviation: string | null;
decision: "pass" | "rejected";
};
function canRelease(run: LeadProgramEvidence): boolean {
return run.stages.length === 6 &&
(run.sample !== "failure" || run.decision === "rejected");
}证据日志至少保留下列字段,并与捕获文件使用同一运行编号。
stage,name,sample,input,observation,result
1,声明数据规模,baseline,planned,observed,pass
2,读取源码路径,baseline,planned,observed,pass
3,建立成本模型,baseline,planned,observed,pass
4,构造边界输入,baseline,planned,observed,pass
5,采集分配耗时,baseline,planned,observed,pass
6,签发语言约束,baseline,planned,observed,pass两个必须主动制造的失败
验收矩阵
| 维度 | 正常样本 | 边界样本 | 失败样本 | 通过条件 |
|---|---|---|---|---|
| 连载 | 原主题逐项定位 | 相邻文章交叉 | 故意漏一项 | 无主题空洞 |
| 结构 | 依赖和状态可见 | 极限规模与阈值 | 注入错误边界 | 首偏离可定位 |
| 运行 | 固定输入可回放 | 长尾与平台差异 | 故障计划 | 结果可复现 |
| 交接 | 他人按证据复验 | 干净环境 | 删除隐含依赖 | 不变量成立 |
练习
小结
- 已覆盖 List 底层源码剖析、Dictionary 底层源码剖析、浮点数的精度问题、委托、事件、装箱、拆箱、排序算法、搜索算法,没有用自拟的热更新或 CI/CD 目录替代原连载。
- 已沿“声明数据规模 → 读取源码路径 → 建立成本模型 → 构造边界输入 → 采集分配耗时 → 签发语言约束”保存正常、边界、失败与修复证据。
- 已记录原写作年代与当前 Unity 的版本映射。
- 已以“相同数据规模和运行时配置下,性能结论可复现,且所有浮点边界与集合容量变化都有明确证据。”作为交接门。