在引用父对象字段,属性或方法时,’base’和’this’之间有什么区别吗?

请考虑以下代码:

public class Vehicle { public void StartEngine() { // Code here. } } public class CityBus : Vehicle { public void MoveToLocation(Location location) { ////base.StartEngine(); this.StartEngine(); // Do other stuff to drive the bus to the new location. } } 

这个this.StartEngine();base.StartEngine(); ,除了在第二种情况下, StartEngine方法无法在CityBus类中移动或覆盖? 是否会对性能产生影响?

唯一的区别是显式调用查看父类与通过简单inheritance最终位于同一位置的隐式类。 性能差异可以忽略不计。 就像Hans Passant所说的那样,如果你在某个时候让StartEngine成为虚拟的话,调用base.StartEngine()会引起奇怪的行为。

您不需要任何限定符来获得正确的位置。 this.StartEngine()在显式编码时几乎总是冗余的。 您可能拥有间接this引用放在对象列表中的代码,但随后它将被调用的列表中的引用:

 public class Vehicle { public void StartEngine() { // Code here. } //For demo only; a method like this should probably be static or external to the class public void GentlemenStartYourEngines(List otherVehicles) { otherVehicles.Add(this); foreach(Vehicle v in Vehicles) v.StartEngine(); } } 

没有区别,StartEngine()不是虚拟的。 您不应该使用base,以防您重构它以使其成为虚拟。 perf diff是不可测量的。

在这种情况下,绝对没有性能差异。

由于StartEngine不是虚拟的,因此无论是在基类,派生类还是外部类中,编译器以及稍后的抖动都确切地知道调用它的含义。

如果StartEngine是虚拟的,并且编译器和/或抖动可以推断出您正在调用CityBus而不是从CityBus派生的内容,那么还可以删除(非常小的)差异作为优化。

如果StartEngine是虚拟的,并且编译器和/或抖动无法推断出您是在调用CityBus而不是派生类,那么基本调用或直接调用之间的区别对于正确性至关重要。

通常,唯一一个用base.调用基本方法的地方base. 是在该方法的覆盖,以使使用更清楚。 如果基本版本和派生版本之间的区别在其他地方很重要,那么您应该尝试重构,以便base.SomeVirtualMethod()调用base.SomeNonVirtual() ,因此即使在derived.SomeVirtualMethod()更改行为时也始终可用。