4

Visual Studioのウォッチウィンドウでオブジェクトを見ると、C#オブジェクトのすべての非パブリック(つまり、プライベート、保護、内部、および内部保護)メンバーが[非パブリックメンバー]の下にあると想定しました。しかし、その後、私はこのコードの異常に気づきました:

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

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

hash1の「非公開メンバー」は次のようになります。

ウォッチウィンドウのhash1

一方、hash2の「非公開メンバー」は次のようになります。

ウォッチウィンドウのhash2

したがって、hash1の場合は、privateフィールド(m_bDisposed)のみが「非公開メンバー」ノードの下に表示されます。hash2の場合もprotectedprotected internal「HashSizeValue」や「HashValue」などのメンバーが表示されます。

なぜこれが起こるのですか?この動作の背後にあるルールは何ですか?

4

1 に答える 1

4

ここに表示されている動作はバグです。このシナリオでは、C#デバッガーに静的メンバーを表示しないでください。私はこれをコードベースの現在の所有者に確認しました。彼はVisualStudioの次のリリースのバグを報告する予定です。

これが発生する特定のシナリオは

  • マイコードのみが有効になっています
  • タイプは、非ユーザーアセンブリであると判断されたもので定義されます
  • 参照とオブジェクトインスタンスのタイプが異なります(切り替えhash2SHA1Cnf問題が解消されます)

これが表示される他のシナリオがある可能性があることに注意してください。これは、私が行ったデバッグ/実験で絞り込むことができた動作です。

于 2012-07-23T16:33:06.113 に答える