'this'关键字实际引用了什么类型?

问题描述:

我有以下代码'this'关键字实际引用了什么类型?

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#'this'关键字;它是否总是引用运行时类型,而不管'this'用于什么范围?

奖励积分的人谁能够“谷歌”比我更好的和明确“本”(双关语意)行为找到MSDN文档。

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

更新#1:在码修正错字;对于当前的答案,我想我没有完全理解MSDN文档中“..是当前实例”的含义。

更新#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"); 
    } 
} 
+1

这是一个合乎逻辑的事情:什么'this'指的是当前对象?这不是'那个',而是'这个'。你的问题甚至不是真的关于'this',而是关于虚拟方法。 –

+2

google'c#this'和this(双关语意)是第一个结果https://msdn.microsoft.com/en-us/library/dk1507sz.aspx – Nkosi

+1

您的派生类不会从目标以外的任何东西中派生出来。 – Nkosi

绝对! investigateThis是指Derived的实例。

所以在Derived虚方法IdentifyYourself将被调用。这是有效的运行时多态性。

范围没有关系。

在引擎盖下,建立了一个虚拟函数表,并且在指向该表的对象中有一个指针。

+0

这通常是有用的信息,但与我最近的代码更新;我再次对使用'this'的含义感到困惑, – AMemberofDollars

'this'总是引用当前实例,而'base'总是引用继承类型,无论使用'this'的代码是在基类还是在子类中,它总是会引用子类(当然,除非基地本身被实例化)。它只是对当前实例的引用,如python中的“self”。如果一个参数与私有字段名称相同,但是有用的话,但据我所知,除此之外,它没有其他功能性用途,为了便于阅读,我使用它来清楚地显示何时属于我正在工作的类。

如果 google: c# this下面的链接是第一个结果

返回。

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

关键字指向类的当前实例,是 也用作扩展方法的第一个参数的改性剂。

你可能也想看看基地而你在这里。

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

关键字派生类内使用基类的访问权限的成员从 :

  • 呼叫已被覆盖在基类中的方法由另一个 方法。

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