'this' 关键字实际指的是什么类型?

What type does the 'this' keyword actually refer to?

我有以下代码

public class Base {

    public Base() {}

    public virtual void IdentifyYourself() {
         Debug.Log("I am a base");
    }

    public void Identify() { this.IdentifyYourself(); }
}

public class Derived : Base {

    public Derived() {}

    public override void IdentifyYourself() {
        Debug.Log("I am a derived");
    }
}

我运行不同入口点的以下测试代码:

Base investigateThis = new Derived();
investigateThis.Identify()

输出为:"I am a derived"

所以无论在什么地方使用C#'this'关键字;无论在什么范围内使用 'this',它总是引用 运行-time 类型吗?

任何能够 'Google' 比我更好并找到关于特定 'this'(双关语)行为的 MSDN 文档的人都会得到奖励。

最后,有没有人碰巧知道引擎盖下发生了什么?只是演员表吗?

更新 #1:修复了代码中的拼写错误;对于当前的一组答案,我想我没有完全理解 MSDN 文档中“..是当前实例..”的含义。

更新#2:抱歉,我不确定我是否应该提出一个单独的问题,但在进一步调查中,我又把自己弄糊涂了;给定这个更新后的代码,为什么输出都是:"I am a derived" & "It is a base!"。

其他人不是回答说'this'确实是运行-时间类型吗?如果我更新的问题仍然不清楚,请告诉我。

更新代码:

public class Base {

    public Base() {}

    public virtual void IdentifyYourself() {
         Debug.Log("I am a base");
    }

    //Updated the code here...
    public void Identify() { this.IdentifyYourself(); AnotherTake(); }

    public void AnotherTake() { WhatIsItExactly(this); }

    public void WhatIsItExactly(Derived thing) {
         Debug.Log("It is a derived!");
    }

    public void WhatIsItExactly(Base thing) {
         Debug.Log("It is a base!");
    }
}

public class Derived : Base {

    public Derived() {}

    public override void IdentifyYourself() {
        Debug.Log("I am a derived");
    }
}

当然! investigateThis 指的是 Derived.

的实例

所以会调用Derived中的虚方法IdentifyYourself。这是 运行 时间多态性的效果。

范围无关紧要。

在幕后,构建了一个虚函数table,对象中有一个指针指向那个table。

'this' 总是指当前实例,而 'base' 总是指继承类型,无论使用 'this' 的代码是在基类还是子类 class,它将始终引用子对象(当然,除非基类本身被实例化)。它只是对当前实例的引用,如 python 中的 'self'。如果参数与私有字段同名,则很有用,但据我所知,除此之外它没有其他功能用途,我使用它是为了提高可读性,以清楚地显示某些内容何时属于 class I正在工作。

如果您google: c# this以下link是返回的第一个结果。

https://msdn.microsoft.com/en-us/library/dk1507sz.aspx

The this keyword refers to the current instance of the class and is also used as a modifier of the first parameter of an extension method.

您可能还想看看 base

https://msdn.microsoft.com/en-us/library/hfw7t1ce.aspx

The base keyword is used to access members of the base class from within a derived class:

  • Call a method on the base class that has been overridden by another method.

  • Specify which base-class constructor should be called when creating instances of the derived class.