C#会重蹈覆辙吗?系列之4:华而不实的C#析构器
前段时间去鸟国出差,颠倒黑白,碌碌无为,疏于写博,请大家理解。下面继续前贴7月《C与C++社区混战,C#会重蹈覆辙吗?》的讨论。这次要谈的是C#的析构器的问题。这是C#中非常华而不实的一个设计,不必要,且常常误导很多C#er,且是.NET性能问题的常见陷阱地带。下面逐项讨论: 1.C#析构器是一个丑陋的语法糖 C#析构器(即Destructor)本质上是对Finalize方法的一个override。既然是对Finalize方法的override,那就大大方方让程序员去override 根类Object的Finalize方法好了。可是,C#设计师们首先搞了一个析构器,接着又在编译器里面把父类的Finalize方法隐藏掉(你去override的时候,告诉你父类没有Finalize方法)。但是编译完后,在IL代码中又告诉你override了父类中的Finalize方法,而你写的析构器却不翼而飞! 我在编程语言历史上看到很多语法糖,有些语法糖华丽,有些语法糖冗赘。但是还从没见过如此弯弯绕的语法糖! 2. C#析构器偏离了析构器原有的意思 析构器自在各编程语言中造始,便有以下两大基本含义: (a) 回收对象内部开销的动态内存以及各种资源 (b) 回收具有确定性时刻,比如delete对象时,或者栈cleanup时。 可是C#将Finalize强扭成析构器后,彻底丢失掉前面两大基本含义