【问题标题】:What type does the 'this' keyword actually refer to?“this”关键字实际上指的是什么类型?
【发布时间】:2016-10-03 14:25:50
【问题描述】:

我有以下代码

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 文档中“..is the current instance..”的含义。

更新#2:抱歉,我不确定我是否应该提出一个单独的问题,但在进一步调查中,我再次感到困惑;鉴于此更新的代码,为什么输出都是:“我是派生的”和“这是一个基础!”。

其他人没有回答“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");
    }
}

【问题讨论】:

  • 这是合乎逻辑的事情:this 可以指代什么而不是当前对象?不是that,是this。你的问题甚至不是关于this,而是关于虚拟方法。
  • google c# this 这(双关语)是第一个结果msdn.microsoft.com/en-us/library/dk1507sz.aspx
  • 你的派生类目前不派生自对象以外的任何东西。
  • @Nkosi yep "this 关键字指的是类的当前实例..."
  • 我会问更新 #2 作为一个单独的问题,因为它现在是关于运行时绑定与多态性的。

标签: c# inheritance this virtual-functions


【解决方案1】:

绝对! investigateThis 指的是Derived 的一个实例。

所以Derived中的虚方法IdentifyYourself会被调用。这实际上是运行时多态性。

范围无关紧要。

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

【讨论】:

  • 这通常是有用的信息,但我最近更新了代码;我再次对使用“this”的含义感到困惑
【解决方案2】:

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

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

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

您可能还想看看 base

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

base 关键字用于从以下位置访问基类的成员 在派生类中:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多