我知道这已经多次讨论了,但我不确定我是否真的理解为什么 Java和C#设计者选择从这些语言中省略这个功能.我对如何制定变通方法(使用接口,克隆或任何其他替代方法)不感兴趣,而是对决策背后的基本原理感兴趣.
从语言设计的角度来看,为什么这个功能被拒绝了?
PS:我正在使用诸如"省略"之类的词语,有些人可能觉得这些词语不合适,因为C#是用加法(而不是减法)方法设计的.但是,我使用这样的词是因为在设计这些语言之前C++中存在这个特性,所以从程序员的工具箱中删除它就省略了.
在这次采访中,安德斯说:
Anders Hejlsberg:是的.关于const,它很有意思,因为我们也一直听到这样的抱怨:"为什么你没有const?" 问题隐含的是,"为什么你没有运行时强制执行的const?" 这正是人们所要求的,尽管他们并没有这样说出来.
const在C++中工作的原因是因为你可以把它丢弃.如果你不能把它扔掉,那么你的世界就会糟透了.如果声明一个采用const Bla的方法,则可以将它传递给非const Bla.但如果是相反的方式你不能.如果声明一个采用非const Bla的方法,则不能将它传递给const Bla.所以现在你被卡住了.所以你逐渐需要一个不是const的所有东西的const版本,你最终得到了一个阴影世界.在C++中,你可以使用它,因为与C++中的任何东西一样,无论你是否想要这个检查,它都是纯粹可选的.如果你不喜欢它,你可以打破常量.
我猜主要是因为:
它无法正确执行,即使在C++中(你可以强制转换)
底部的单个const可以强制调用树中的整个const链
两者都有问题.但特别是第一个:如果不能保证,它有什么用?更好的选择可能是:
不可变类型(完全不变性或冰棒不变性)