2017-02-15 114 views
1

我正在研究this的用法,我想我至少部分地理解它,比如什么时候解决歧义和调用“当前”类的方法,但本书的一个示例我在读(深入浅出C#)是给了我一个困难时期:“this”的用法关键字

public void SpeakTo(Elephant whoToTalkTo, string message) { 
    whoToTalkTo.TellMe(message, this); 
} 

在这种方法中,是可以安全地说,this具有总是指的任何对象调用方法SpeakTo()功能,无论呼叫被写入哪一类?

+2

'this'指的是物体本身。例如:'myFoo.speakTo(...)'将具有'this'等于'myFoo' – CollinD

回答

2

在这种方法中,是可以安全地说,“这”有总是指的任何对象调用方法“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。即方法名称之前的对象。

+0

换句话说,在“bar.SpeakTo()”中,“bar”仅仅是方法应该被定位和使用的地方的引用(“bar”不调用任何东西),并且“this”用于传递“酒吧”本身就是一种说法。它是否正确? – NeoTrader

+0

是@NeoTrader一个名为'foo'的'Foo'对象调用'SpeakTo()'_on_'bar'。 – Sweeper

+0

并不总是对的。如果我编写一个从'Bar'继承的'BarChild'类,那么'this'实际上是一个指向'BarChild'而不是'Bar'的实例的指针。这就是多态性是如何工作的。 –

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; 
    } 
} 

此实现改变了传递给它一个特定的对象的状态。

现在最终呼叫者来的图像,所述一个实际上选择其将要进行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实际上一直在修改两个不同对象的状态。

+0

您示例中的对象“扬声器”是来自Class Speaker的参考变量。如果我在同一个类中有更多来自类扬声器的一个参考变量,例如对象“讲者”,那么该怎么办?如果“this”关键字仅指一个Speaker类实例,不管名为SpeakTo()的实例如何,编译器如何知道它必须通过“speaker”而不是“talker”作为参数? – NeoTrader

+0

'this''关键字总是指写入它的类的对象。 'Speaker'方法中的'this'是'Speaker'类的对象; 'Talker'方法中的'this'是'Talker'类的对象,依此类推。 –

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(); 

在该方法中SpeakTothis指当前对象,即obj

方法TellMe的签名应该是这样的:

public void TellMe(string message, A objOfA)