'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.
我有以下代码
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.