匿名类型的硬伤:围绕this的成员捕获策略
这篇讲的是C#程序员常憧憬的Java式匿名类特性,但作者在深究Java语言规范后,却发现了其中围绕 `this` 的成员捕获策略存在难以回避的“硬伤”。这并非关乎设计品位,而是一个根本性的实现难题。 文章的核心对比在于,Java的匿名类(作为内部类的一种)在捕获外部成员时,必须隐式或显式地通过一个外部类引用来访问 `this`。这导致了代码意图与实际执行之间的微妙错位:你在匿名类里写的 `this` 指向的是匿名类自身,而要访问外部成员则需要借助外部类实例。相比之下,C#的lambda表达式捕获的是变量副本或引用,其行为更直接、一致。 作者从实际编码体验出发,剖析了这种差异带来的后果。Java的这种方式可能导致非预期的内存持有和更复杂的生命周期问题,使得某些场景下的代码既不直观也不安全。最终的结论颇具启发性:一个语言特性的引入,不能只看表面的便捷,其底层对核心概念(如 `this`)的处理方式,才决定了它是否是一个“干净”的设计。如果C#无法用更优雅的方式解决这个捕获策略,那么保持现状反而是更负责任的选择。