在课堂外可见的私人成员
Posted
技术标签:
【中文标题】在课堂外可见的私人成员【英文标题】:Private members visible outside the class 【发布时间】:2015-03-20 15:02:55 【问题描述】:为什么当断点在类之外时,我可以在快速观察窗口中看到我的类的私有成员?
我的断点在 ConsoleApplication.cpp 我的类是在 XmlSignature.h 中定义的
我可以看到这些私有成员:Transforms_Root_element、xmlDocument
这是我的课:
ref class XmlReference
public:
XmlReference(String^ URI);
virtual ~XmlReference();
String^ URI;
XmlElement^ Reference_element;
String^ ns_ds = "http://www.w3.org/2000/09/xmldsig#";
XmlNode^ AddTransform(String^ strAlgorithm);
XmlNode^ AddTransform(String^ strAlgorithm, String^ strParameterName, String^ strParameter);
List<XmlNode^>^ Transforms = gcnew List<XmlNode^>;
private:
XmlNode^ Transforms_Root_element = nullptr;
XmlDocument^ xmlDocument;
//Called by AddTransform
XmlNode^ CreateTransformElement(String^ strAlgorithm);
;
这是我能看到的:
【问题讨论】:
【参考方案1】:这是一个功能,在调试时很有帮助:-)。 编译器确保类成员可见性以强制执行面向对象的编程。正如@Medinoc 观察到的,.net 运行时还保护类的私有和受保护内存不被其他上下文访问。
在任何情况下,调试器都可以完全访问内存并且可以显示所有成员内容。
【讨论】:
感谢您的回答! 请注意,它在运行时是安全的,因为如果没有MemberAccess
ReflectionPermission
标志,则无法通过反射访问私有成员。另一方面,在您开始在单独的 AppDomain 中显式执行插件之前,您程序中的所有内容都是完全信任的;
它是:反射、代码访问安全等,它都与.Net安全模型联系在一起。当然,调试器不必关心这一点:调试器可以直接访问被调试程序的内存,而不管其他安全考虑,所以它只是查看 PDB 所说的数据在哪里,并根据需要显示它。
谢谢,我试图在答案中澄清这一点。之前没看到c++-cli标签。以上是关于在课堂外可见的私人成员的主要内容,如果未能解决你的问题,请参考以下文章