C# ';基数';和';这';当引用父对象字段、属性或方法时?

C# ';基数';和';这';当引用父对象字段、属性或方法时?,c#,optimization,oop,syntax,C#,Optimization,Oop,Syntax,考虑以下代码: public class Vehicle { public void StartEngine() { // Code here. } } public class CityBus : Vehicle { public void MoveToLocation(Location location) { ////base.StartEngine(); this.StartEngine();

考虑以下代码:

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
类中移动或重写?是否会对性能产生影响?

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

唯一的区别是显式调用查看父类,而隐式调用通过简单继承最终位于同一位置。性能差异可以忽略不计。正如Hans Passant所说,如果您在某个时候将StartEngine设置为虚拟,那么对base.StartEngine()的调用将导致奇怪的行为

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

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<Vehicle> otherVehicles)
    {
       otherVehicles.Add(this);

       foreach(Vehicle v in Vehicles) v.StartEngine();
    }
}
公共级车辆
{
公共空间StartEngine()
{
//代码在这里。
}
//仅用于演示;这样的方法可能是静态的或类外部的
公共车辆启动发动机(列出其他车辆)
{
其他车辆。添加(本);
foreach(车辆中的车辆)v.StartEngine();
}
}

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

由于StartEngine不是虚拟的,编译器,以及后来的jitter,确切地知道调用它意味着什么,无论是在基类、派生类还是从外部类

如果StartEngine是虚拟的,并且编译器和/或jitter可以推断您调用的是城巴,而不是从城巴派生的东西,那么作为优化,也可以删除存在的(非常小的)差异

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

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