簡體   English   中英

為什么當我在監視視圖中觀察基類對象時,VS2017為什么向我顯示派生類的成員值?

[英]Why does VS2017 show me the member values of derived classes when I watch the base class object in the watch view?

我有3個類別的類別層次結構:KlasseA,KlasseB和KlasseC。 KlasseC繼承自KlasseB。 KlasseB繼承自KlasseA。

這些類中的每一個都具有int類型的屬性A,B和C以及字段a,b和c:

public class KlasseA
{
    private int a;

    public int A { get => a; set => a = value; }
}
public class KlasseB: KlasseA
{
    private int b;

    public int B { get => b; set => b = value; }
}
public class KlasseC: KlasseB
{
    private int c;

    public int C { get => c; set => c = value; }
}

(我省略了不必要的構造函數和檢查邏輯)

現在,我可以編寫以下代碼:

class Program
{
    static void Main(string[] args)
    {
        KlasseA aKlasse;
        KlasseB bKlasse;
        KlasseC cKlasse;
        aKlasse = new KlasseC() { A = 4, B = 5, C = 6 };
        bKlasse = aKlasse as KlasseB;
        cKlasse = aKlasse as KlasseC;
    }

}

當我將aKlassebKlassecKlasse添加到監視窗口時,所有3個都顯示類型為KlasseC的值,但類型分別顯示為"KlasseA (KlasseC)""KlasseB (KlasseC)""KlasseC"

展開所有3個watch變量后,我可以在所有3個變量中看到所有3個字段和屬性:

-aKlasse    {KlasseC}    KlasseA {KlasseC}
 A          4            int
 B          5            int
 C          6            int
 a          4            int
 b          5            int
 c          6            int
-bKlasse    {KlasseC}    KlasseB {KlasseC}
 A          4            int
 B          5            int
 C          6            int
 a          4            int
 b          5            int
 c          6            int
-cKlasse    {KlasseC}    KlasseC
 A          4            int
 B          5            int
 C          6            int
 a          4            int
 b          5            int
 c          6            int

我認為這是不正確的,因為在代碼中我永遠無法編寫

aKlasse.C = aKlasse.A;

即使監視窗口指示aKlasse具有屬性AB和C。

有人可以確認或駁斥我的假設嗎?

它向您顯示執行時間數據-這遠比僅根據編譯時已知的內容向您顯示要有用得多。 基本上,它向您顯示“變量所引用的對象”,並且代碼中的對象是KlasseC ,而不管變量的類型如何。

例如,如果您有一個類型為Stream的變量,但實際上是在執行時對MemoryStream的引用,那么您希望能夠輕松地查看列表,而無需使用監視窗口調用Read等。

這不是錯誤-這是一個功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM