“this”的用法关键字
我正在研究this
的用法,我想我至少部分地理解它,比如什么时候解决歧义和调用“当前”类的方法,但本书的一个示例我在读(深入浅出C#)是给了我一个困难时期:“this”的用法关键字
public void SpeakTo(Elephant whoToTalkTo, string message) {
whoToTalkTo.TellMe(message, this);
}
在这种方法中,是可以安全地说,this
具有总是指的任何对象调用方法SpeakTo()
功能,无论呼叫被写入哪一类?
在这种方法中,是可以安全地说,“这”有总是指的任何对象调用方法“SpeakTo功能()“,而不管哪个类的调用被写入?
没有。 this
确实不是是指调用SpeakTo
的对象。它指的是调用SpeakTo
的对象。
我会使用一些代码来说明这一点
class Foo {
public static void Main(String[] args) {
var foo = new Foo();
foo.MyMethod();
}
public void MyMethod() {
var bar = new Bar();
bar.SpeakTo(anElephant, "Hello");
}
}
class Bar {
public void SpeakTo(Elephant whoToTalkTo, string message) {
whoToTalkTo.TellMe(message, this);
}
}
按照你的说法,this
是指在main方法创建的foo
变量。这是不是的情况。 this
实际上是指bar
。即方法名称之前的对象。
不......实际上,this
在您的上下文中是指定义对象SpeakTo
,而不是调用它的对象。
让我们把这种方式:
- 对象
speaker
是类Speaker
定义了SpeakTo
方法, - 对象
caller
被调用speaker.SpeakTo()
,并 - 对象
whoToTalkTo
是类的其定义了TellMe(string, Speaker)
正如您所见,whoToTalkTo
正在等待Speaker
类实例。然后,speaker
对象正是这样,并且可以自由地通过this
作为参数。
现在我们可以构建这些关系越来越明显的更大的示例:
class Speaker
{
public int Data { get; set; }
public void SpeakTo(Elephant whoToTalkTo, string message)
{
// Passing current instance of this class as the argument
whoToTalkTo.TellMe(message, this);
}
}
这Speaker
类包含一块的状态。现在,我将使用whoToTalkTo
对象更改状态:
class Talker
{
public void TellMe(string message, Speaker speaker)
{
speaker.Data = message.Length;
}
}
此实现改变了传递给它一个特定的对象的状态。
现在最终呼叫者来的图像,所述一个实际上选择其将要进行TellMe()
方法Speaker
对象:
class Caller
{
public void DoWork()
{
Talker talker = new Talker();
Speaker one = new Speaker();
Speaker two = new Speaker();
// This sets one.Data to length of "something"
one.SpeakTo(talker, "something");
// This sets two.Data to length of "else"
two.SpeakTo(talker, "else");
Console.WriteLine(one.Data);
Console.WriteLine(two.Data);
}
}
此代码将打印值9和图4,这表明whoToTalkTo
实际上一直在修改两个不同对象的状态。
您示例中的对象“扬声器”是来自Class Speaker的参考变量。如果我在同一个类中有更多来自类扬声器的一个参考变量,例如对象“讲者”,那么该怎么办?如果“this”关键字仅指一个Speaker类实例,不管名为SpeakTo()的实例如何,编译器如何知道它必须通过“speaker”而不是“talker”作为参数? – NeoTrader
'this''关键字总是指写入它的类的对象。 'Speaker'方法中的'this'是'Speaker'类的对象; 'Talker'方法中的'this'是'Talker'类的对象,依此类推。 –
this
是指具有方法SpeakTo
的类的当前对象。
考虑下面的例子:
public class A
{
public void SpeakTo(Elephant whoToTalkTo, string message) {
whoToTalkTo.TellMe(message, this);
}
}
现在,如果你实例化的A
的对象,并调用该方法SpeakTo
它会像:
A obj = new A();
obj.SpeakTo();
在该方法中SpeakTo
,this
指当前对象,即obj
。
方法TellMe
的签名应该是这样的:
public void TellMe(string message, A objOfA)
'this'指的是物体本身。例如:'myFoo.speakTo(...)'将具有'this'等于'myFoo' – CollinD