冗余的New

据说软件设计的最高境界是“面对这个设计,你不能再减少什么。”,也就是如爱因斯坦所说“As simple as possible, but not simpler”。

Java和C#就是2种打着简化C++语言设计大旗的两种语言,但是它们显然离上述“减之一分则太少”的设计美学标准还差得远。

比如说,这两天我就对这2种语言中的new关键字看得不顺眼,因为它完全是一个不必要的冗余设计。

先从C++说起,假设我们定义了一个class Foo,那么按照下面两个不同的语句定义的变量是完全不同的:

Foo bar=Foo();

Foo bar=new Foo();

其不同就在于前者bar的存储空间是栈,而后者bar的存储空间是自由堆。前者的析构由编译器自动完成,而后者析构需要程序员显式用delete完成。在C++中,newdelete总是成对出现是一个基本的常识。

到了java和C#的世界里,关于存储管理有两件大事发生了:1,除了primitive type之外的所有类型变量都在堆中分配;2,自动垃圾收集代替了程序员手工delete。后者打破了C++中的new和delete对称,即使从美学的角度看也是遗憾的事情。

更重要的是,从实用角度看在java和C#中new本来也是可以废弃的!这是因为既然没有了栈变量,那么

Foo bar=Foo(); 和 Foo bar=new Foo();

就可以表达完全相同的含义而不会带来疑义。你说什么?“可能和原生类型混淆”?别扯了,Java和C#的编译器会弱智到用new来区分原生类型和class类型吗?

关于我这个说法的一个佐证就是,同样作为没有栈变量并采用自动垃圾收集的语言,Python就不需要new关键字。相信我,Python没有因为这个原因而完蛋!:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值