2012-07-21 73 views
3

當我在Visual Studio的Watch Window中查看對象時,我認爲C#對象的所有非公開(即私人,受保護,內部和內部受保護)成員都屬於「非公開成員」。但後來,我發現此代碼anamoly:Visual Studio的Watch窗口中的「非公共成員」節點有什麼?

class HashDerived : System.Security.Cryptography.HashAlgorithm { ... } 

    HashAlgorithm hash1 = new HashDerived(); 
    HashAlgorithm hash2 = new System.Security.Cryptography.SHA1Cng(); 

hash1的‘非公共成員’看起來是這樣的:

hash1 in Watch Window

hash2的‘非公共成員’看起來是這樣的:

hash2 in Watch Window

所以它只是似乎是HASH1,該private字段(m_bDisposed)出現在「非公開成員」節點下,其中對於hash2,甚至protectedprotected internal成員(如「HashSizeValue」和「HashValue」)出現在其中。

爲什麼會發生這種情況?這種行爲背後的規則是什麼?

+0

SHA1Cng被聲明**密封**。因此,其受保護的成員不再可以被任何派生類訪問。 – 2012-07-21 20:07:32

回答

3

你在這裏看到的行爲是一個錯誤。在這種情況下,C#調試器不應該顯示靜態成員。我向代碼庫的當前所有者證實了這一點,他將爲Visual Studio的下一個版本提交一個錯誤。

特定情景下發生這種情況是

  • 僅我的代碼啓用
  • 類型在什麼確定爲一個非用戶組裝
  • 類型的參考和對象的界定實例不同(開關hash2SHA1Cnf並且問題消失)

請注意,可能會出現其他情況。這是我在調試/實驗中縮小的行爲。

相關問題