我假定当我在Visual Studio的“监视窗口”中查看对象时,C#对象的所有非公共(即私有,受保护,内部和内部受保护)成员都位于“非公共成员”下.但是后来,我注意到了这段代码:
class HashDerived : System.Security.Cryptography.HashAlgorithm { ... }
HashAlgorithm hash1 = new HashDerived();
HashAlgorithm hash2 = new System.Security.Cryptography.SHA1Cng();
hash1的“非公共成员”如下所示:
而hash2的“非公共成员”看起来像这样:
因此,对于hash1来说,似乎只有私有字段(m_bDisposed)出现在“非公共成员”节点下,对于hash2,甚至在受保护和受保护的内部成员(如“ HashSizeValue”和“ HashValue”)中也都出现了.
为什么会这样?这种行为背后的规则是什么?
解决方法:
您在此处看到的行为是一个错误.在这种情况下,C#调试器不应显示静态成员.我已与代码库的当前所有者确认了这一点,他将为下一版Visual Studio提交一个错误.
发生这种情况的具体情况是
>启用我的代码
>在确定为非用户程序集的类型中定义类型
>引用和对象实例的类型不同(将hash2切换为SHA1Cnf,问题消失了)
请注意,可能还会出现其他情况.这是我能够在调试/实验中缩小的行为.