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) 出现在“ Non-Public members ”节点下,对于 hash2,evenprotectedprotected internal“HashSizeValue”和“HashValue”等成员出现在其中。

为什么会这样?这种行为背后的规则是什么?

4

1 回答 1

4

您在此处看到的行为是一个错误。在这种情况下,C# 调试器不应显示静态成员。我与代码库的当前所有者确认了这一点,他将为 Visual Studio 的下一个版本提交一个错误。

发生这种情况的具体情况是

  • 仅我的代码已启用
  • 该类型在确定为非用户程序集的内容中定义
  • 引用和对象实例的类型不同(切换hash2SHA1Cnf问题消失)

请注意,可能还会出现其他情况。这是我在我所做的调试/实验中能够缩小范围的行为。

于 2012-07-23T16:33:06.113 回答