在引用父对象字段,属性或方法时,’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()
更改行为时也始终可用。