看了对Anders Hejlsberg的,
1)C#中函数默认是非virtual的设计因为:在java中,一个方法默认是虚拟化的,只有对一个方法必须声明final关键字,这样这个方法才是非虚的,无法被子类重写。而C#中,方法默认是非虚的,只有加上virtual关键字,子类才能被重写。
据Hejlsberg说,这样设计的好处是,第一,他观察到很多java程序员都忘写final;第二,虚化性能相对于非虚化要差一点。
2)virtual这个关键字其实含义是为了版本控制。用他自己的话说,
"版本控制最终会是语言设计的一大要素。它体现于你如何覆盖C#虚拟方法。同样因为版本控制,我们C#里重载的解决方案也和我所知的其它方法不大一样。无论何时,在设计特别的功能特性时,我们都会使用版本控制交叉检验。“在版本控制会如何改变它?从版本控制的角度来看,这个函数怎么样?”大多数以前的编程语言都没有考虑过这方面。"
并且
我对编程语言多年来变化进行观察。20-25年前,我们只有640k内存栅栏,每年都需要抛弃以前的代码,花一年时间重写一遍,正好赶上新版本发布的时间。所以你并不需要考虑重用?版本控制是什么?我们每年都需要重写一遍代码。但是这都已经过去了,再也不会碰到这样的问题。根据摩尔定律,我们恐怕也不会用光所有的存储容量。现在我们花更少的精力就可以比原来得到更多的基础设施和应用、功能。而系统的寿命也在增长,所以版本控制变得越来越重要。