我正在研究this
的用法,我想我至少在一定程度上理解它,比如什么时候解决歧义并从“当前”类中调用方法,但是我从书中得到了一个例子。阅读(Head First C#)让我很难过:
public void SpeakTo(Elephant whoToTalkTo, string message) {
whoToTalkTo.TellMe(message, this);
}
在这种方法中,可以安全地说this
具有始终引用调用方法SpeakTo()
的任何对象的功能,无论写入哪个类调用?
答案 0 :(得分:4)
否......实际上,您的上下文中的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;
}
}
此实现正在更改传递给它的一个特定对象的状态。
现在终极调用者来到了图片中,实际上选择了Speaker
对象的对象将会受到TellMe()
方法的影响:
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
实际上已经修改了两个不同对象的状态。
答案 1 :(得分:2)
在这种方法中,可以安全地说“this”具有始终引用任何对象调用方法“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
。即方法名称之前的对象。
答案 2 :(得分:0)
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)