2017-02-15 98 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)