默认非虚、override 与契约:一次 C2 复习复盘
这篇讲清一件事:C# 多态里,默认非虚 、override / new、接口与抽象类、构造里调虚,以及 sealed 与虚调用代价,各自管什么、怎么说才准。
下面按主题给口径,不铺过程流水账。
默认非虚virtual / override / new接口与抽象类构造调虚sealed 与虚调用代价默认非虚 :C# 实例方法默认不是虚方法;Java 默认是虚的。要开放扩展点,必须显式标 virtual(或 abstract)。
这样设计的常见理由:
未标虚的方法更容易被 JIT 内联 ,热路径更稳
减少 脆弱基类问题 :基类随便加可覆盖行为,派生类悄悄被改语义
版本控制 :作者主动 opt-in,才把某成员变成可被 override 的契约
设计含义:基类公开 API 只在「故意允许派生改写」的地方标 virtual,不要为了「以后也许要扩展」整片打开。override :改写虚表槽位,按运行时类型调度。
new :隐藏基类同名成员,按编译时类型看;不加入虚调用链,也不替换已有虚槽。
最小对照:
1234567891011121314class Base{ publ ...
值类型、装箱和防御性拷贝:一次 C1 复习复盘
这篇复盘解决一件事:把 C# 类型系统里「赋值怎么拷、值放哪、何时装箱、窄化与 checked、struct 防御性拷贝」从能写出代码,整理成面试里能讲清楚、讲对的说法。
写给同在补基础的同行,也写给以后可能读到它的面试官:下面按主题给口径,不铺过程流水账。
背景离职求职期间,我把 C# 类型系统从「能用」推到「说得清」。方法是固定五步:读官方文档 → 追问式 Q&A → 自写「类型行为观察器」demo(先写预测再跑)→ 费曼复述 → 模拟面试,再用错题补强。
五步都做完了。文档侧对照了 Microsoft Learn 的类型系统、值/引用、装箱拆箱、可空值类型和数值转换;Q&A 把几个长期绝对化的判断掰正(值类型不总在栈上、装箱看最终调到的是不是基类方法、null 的 int? 装箱结果是空引用、常量窄化在编译期检查)。demo 跑出 20 行输出,与预测全部吻合。费曼口述里仍有过概念说反,纠正后才过。模拟面试压力下,已经纠正过的点又会退回去,于是针对「防御性拷贝」和「字符串驻留」做了补强复测,直到能稳定讲对。
下面用分栏按主题写结论。
赋值语义装箱与 Nulla ...
入行第六年,AI 来了
大家好,我重启了这个博客。
它搭建于 2021 年,之后却一直空着。一方面是没想好要记录什么,另一方面也是因为自己的惰性。这几年我并不是没有在学,只是学得很慢,也学得不多。
今天是 2026 年 9 月 28 日。不久前,我辞去了一份做了四年半的工作,想出来看看,体验一些不同的项目。可真正走出来之后才发现,现实并没有我想的那么理想。AI 带来的冲击很大,至少对我这样一个中级、还称不上高级的程序员来说,有些难以招架。
所以我决定重启这个博客,记录自己接下来的成长。我打算从头再来一遍,看看自己能不能追上 AI 时代的节奏,也算是真正跳出在稳定环境里待久了的舒适圈。
这篇文章写给我自己,也写给以后可能看到它的面试官。
我是谁我选择游戏行业,是因为上学时就很喜欢玩游戏。不过我大学读的是工科,专业和游戏关系不大,直到大学期间接触到 Unity,才开始向往这个方向。能把工作和热爱结合在一起,我觉得是一件很好的事。
至于为什么选客户端:客户端是整个游戏最终呈现的地方,所有东西最后都要在你这里输出,你能把控很多细节。再加上我是工科出身,相比偏文科的策划和偏美术的岗位,客户端更适合我。
入行这些年 ...


