这个'这是什么类型的?关键字实际上是指?

时间:2016-10-03 14:25:51

标签: c# inheritance this virtual-method

我有以下代码

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()

输出为:"我是派生的"

所以无论C#'这个'使用关键字;无论在什么范围内,它总是指运行时类型'这个'用于?

奖励积分指向任何能够使用谷歌的人。比我好,并专门找到MSDN文档'这个' (双关语)行为。

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

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

更新#2 :道歉,我不确定我是否应该提出单独的问题,但经过进一步调查,我再次感到困惑;给定这个更新的代码,为什么输出都是:"我是派生的" &安培; "它是一个基地!"。

其他人没有回答过这个'这个'确实是运行时类型?如果我的更新问题仍然不明确,请告诉我。

更新的代码:

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");
    }
}

3 个答案:

答案 0 :(得分:1)

绝对! investigateThis指的是Derived

的实例

因此将调用IdentifyYourself中的虚拟方法Derived。这是运行时多态性有效。

范围无关紧要。

在底层,构建了一个虚函数表,并且对象中有一个指向该表的指针。

答案 1 :(得分:0)

'这'总是指当前的实例,而' base'总是指继承的类型,无论代码是否使用' this'在基类或子类中,它将始终引用子项(当然,除非基本实例化)。它只是对当前实例的引用,例如' self'在python中。如果参数与私有字段具有相同的名称,则有用,但据我所知,除此之外它没有任何功能目的,我将其用于可读性,以清楚地显示何时某些属于类I&#39我正在工作。

答案 2 :(得分:0)

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

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

  

this 关键字引用该类的当前实例,并且是   也用作扩展方法的第一个参数的修饰符。

您可能还想看看 base

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

  

base 关键字用于访问基类的成员   在派生类中:

     
      
  • 在基类上调用已被另一个方法覆盖的方法   方法

  •   
  • 指定创建时应调用哪个基类构造函数   派生类的实例。

  •   
相关问题