2016-10-03 37 views
-3

我有以下代碼'this'關鍵字實際引用了什麼類型?

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

,輸出是:「我是一個派生」

所以不管在哪裏使用C#'this'關鍵字;它是否總是引用運行時類型,而不管'this'用於什麼範圍?

獎勵積分的人誰能夠「谷歌」比我更好的和明確「本」(雙關語意)行爲找到MSDN文檔。

最後,沒有人知道發生了什麼是引擎蓋下發生?它只是一個演員?

更新#1:在碼修正錯字;對於當前的答案,我想我沒有完全理解MSDN文檔中「..是當前實例」的含義。

更新#2:道歉,我不確定我是否應該提出一個單獨的問題,但進一步調查後,我再次迷茫自己;給出這個更新的代碼,爲什麼輸出都是:「我是派生的」&「這是一個基地!」。

沒有其他人回答說「這」確實是運行時類型?讓我知道如果我更新的問題仍然不清楚。

更新代碼:

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"); 
    } 
} 
+1

這是一個合乎邏輯的事情:什麼'this'指的是當前對象?這不是'那個',而是'這個'。你的問題甚至不是真的關於'this',而是關於虛擬方法。 –

+2

google'c#this'和this(雙關語意)是第一個結果https://msdn.microsoft.com/en-us/library/dk1507sz.aspx – Nkosi

+1

您的派生類不會從目標以外的任何東西中派生出來。 – Nkosi

回答

1

絕對! investigateThis是指Derived的實例。

所以在Derived虛方法IdentifyYourself將被調用。這是有效的運行時多態性。

範圍沒有關係。

在引擎蓋下,建立了一個虛擬函數表,並且在指向該表的對象中有一個指針。

+0

這通常是有用的信息,但與我最近的代碼更新;我再次對使用'this'的含義感到困惑, – AMemberofDollars

0

'this'總是引用當前實例,而'base'總是引用繼承類型,無論使用'this'的代碼是在基類還是在子類中,它總是會引用子類(當然,除非基地本身被實例化)。它只是對當前實例的引用,如python中的「self」。如果一個參數與私有字段名稱相同,但是有用的話,但據我所知,除此之外,它沒有其他功能性用途,爲了便於閱讀,我使用它來清楚地顯示何時屬於我正在工作的類。

如果 google: c# this下面的鏈接是第一個結果
0

返回。

https://msdn.microsoft.com/en-us/library/dk1507sz.aspx

關鍵字指向類的當前實例,是 也用作擴展方法的第一個參數的改性劑。

你可能也想看看基地而你在這裏。

https://msdn.microsoft.com/en-us/library/hfw7t1ce.aspx

關鍵字派生類內使用基類的訪問權限的成員從 :

  • 呼叫已被覆蓋在基類中的方法由另一個 方法。

  • 指定在創建派生類的 實例時應調用哪個基類構造函數。

相關問題