为了账号安全,请及时绑定邮箱和手机立即绑定

为什么当我在监视视图中监视基类对象时,VS2017 会显示派生类的成员值?

为什么当我在监视视图中监视基类对象时,VS2017 会显示派生类的成员值?

C#
慕斯709654 2023-08-27 10:16:33
我有 3 个类 KlasseA、KlasseB 和 KlasseC 的类层次结构。ClassC继承自ClassB。B类继承自A类。这些类中的每一个都有各自的 int 类型属性 A、B 和 C 以及字段 a、b 和 c:public class KlasseA{    private int a;    public int A { get => a; set => a = value; }}public class KlasseB: KlasseA{    private int b;    public int B { get => b; set => b = value; }}public class KlasseC: KlasseB{    private int c;    public int C { get => c; set => c = value; }}(我省略了不必要的构造函数和检查逻辑)现在我可以编写以下代码:class Program{    static void Main(string[] args)    {        KlasseA aKlasse;        KlasseB bKlasse;        KlasseC cKlasse;        aKlasse = new KlasseC() { A = 4, B = 5, C = 6 };        bKlasse = aKlasse as KlasseB;        cKlasse = aKlasse as KlasseC;    }}当我将aKlasse,bKlasse和添加cKlasse到监视窗口时,所有 3 个都显示 type 的值KlasseC,但类型分别显示为"KlasseA (KlasseC)"和"KlasseB (KlasseC)"和"KlasseC"。展开所有 3 个监视变量后,我可以看到所有 3 个变量中的所有 3 个字段和属性:-aKlasse    {KlasseC}    KlasseA {KlasseC} A          4            int B          5            int C          6            int a          4            int b          5            int c          6            int-bKlasse    {KlasseC}    KlasseB {KlasseC} A          4            int B          5            int C          6            int a          4            int b          5            int c          6            int-cKlasse    {KlasseC}    KlasseC A          4            int B          5            int C          6            int a          4            int b          5            int c          6            int我认为这是不正确的,因为在代码中我永远无法编写aKlasse.C = aKlasse.A;即使监视窗口指示 aKlasse 具有属性 AB 和 C。有人可以证实或反驳我的假设吗?
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

它向您显示执行时间数据 - 这比仅向您显示基于编译时已知的内容要有用得多。基本上,它向您显示“变量引用的对象” - 并且代码中的该对象是 a KlasseC,无论变量的类型如何。

例如,如果您有一个类型为 的变量Stream,但它实际上是在执行时对 a 的引用MemoryStream,您希望能够轻松查看列表,而无需使用监视窗口来调用Read等。

这不是一个错误 - 这是一个功能。


查看完整回答
反对 回复 2023-08-27
  • 1 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信