不严格的说:
重载就是提供名称相同,参数不同的方法 。
重写则是改变基类方法的行为。
.net类不支持静态方法重写和继承
运算符是重载的静态方法,调用静态方法会锁住类级的独占锁。所以需要在多线程环境下执行大量计算的过程最好能不用操作符实现就别用操作符实现。比如Vector3这样的类型,直接把各种操作写在运算符方法里造成不比要的线程等待。折衷的方法是用实例方法实现,再由运算符调用实例方法。当然,性能最好的方案是直接调用实例方法,虽然看起来不那么优雅,但不有更好的清晰性。
类似的例子还有Equal和operator ==。operator ==的行为是由当前引用的类型决定的,而Equal是由对象的最终类型决定的。具体来说,
string strStr = "abc";
object objStr = strStr;
objStr.Equal方法是调用String的实现
strStr.Equal方法同样是调用String的实现
objStr.op_equality方法是调用Object的实现
strStr.op_equality方法则是调用String的实现
.net的虚方法(可重写的方法),与标准C++在行为上的不同:
在构造函数中调用虚方法:C++会调用已经执行到的那一级,因为vtbl是在构造函数中更新的。而C#始终会调用最终类型的实现。所以,在构造函数中最好别调用虚方法,因为最终实现此方法的类型的构造函数还没有被执行过,不能保证虚方法需要的资源都已适当的初始化过。