在课堂外可见的私人成员

Posted

技术标签:

【中文标题】在课堂外可见的私人成员【英文标题】:Private members visible outside the class 【发布时间】:2015-03-20 15:02:55 【问题描述】:

为什么当断点在类之外时,我可以在快速观察窗口中看到我的类的私有成员?

我的断点在 ConsoleApplication.cpp 我的类是在 XmlSignature.h 中定义的

我可以看到这些私有成员:Transforms_Root_elementxmlDocument

这是我的课:

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标签。

以上是关于在课堂外可见的私人成员的主要内容,如果未能解决你的问题,请参考以下文章

中软实训 0727课堂笔记

冒号课堂阅读笔记OO的继承

PyQt - 课堂外的标签管理

PyQt5 在课堂外添加和删除标签

如何在 Ruby 中创建私有类常量

封装 - 为啥我使用 getter setter 将我的数据成员公开,如果我已经在课堂上声明它们是私有的