Frage

Ich habe eine Basisklasse "Eltern" wie folgt:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Parent
    {
        private int parentVirtualInt = -1;
        public virtual int VirtualProperty
        {
            get
            {
                return parentVirtualInt;
            }
            set
            {
                if(parentVirtualInt != value)
                {
                    parentVirtualInt = value;
                }
            }
        }
    }
}

Und eine Kinderklasse wie diese:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Child : Parent
    {
        public override int VirtualProperty
        {
            get
            {
                if(base.VirtualProperty > 0)
                {
                    throw new ApplicationException("Dummy Ex");
                }
                return base.VirtualProperty;
            }
            set
            {
                if(base.VirtualProperty != value)
                {
                    base.VirtualProperty = value;
                }
            }
        }
    }
}

Beachten Sie, dass der Getter in Child den Getter des Elternteils anruft (oder zumindest das ist, was ich beabsichtige).

Ich benutze jetzt die "Child" -Klasse, indem ich sie instanziiere, deren Wert (sagen wir 4) seiner virtuellen Anpassung und dann die Eigenschaft erneut.

Child c = new Child();
c.VirtualProperty = 4;
Console.Out.WriteLine("Child.VirtualProperty: " + c.VirtualProperty);

Wenn ich das ausführe, bekomme ich offensichtlich eine Anwendung, die "Dummy Ex" sagt. Aber Wenn ich einen Haltepunkt in der Linie festlegt

if(base.VirtualProperty > 0)

im Kind und überprüfe den Wert von base.VirtualProperty (durch Überschwebe der Maus darüber) bevor die Ausnahme geworfen werden kann (Ich nehme an (d)), ich bekomme bereits die Ausnahme. Daraus vermitteln ich das die Aussage base.VirtualProperty in der "Kind-Getter nennt sich"; So'ne Art.

Was ich erreichen möchte, ist das gleiche Verhalten, das ich bekomme, wenn ich die Definition von ändere parentVirutalInt (im Elternteil) zu schützen und zu verwenden base.parentVirtualInt im Getter des Kindes statt des base.VirtualProperty. Und ich verstehe noch nicht, warum das nicht funktioniert. Kann jemand etwas Licht darauf werfen? Ich habe das Gefühl, dass sich überschriebene Eigenschaften anders verhalten als überschriebene Methoden?

Übrigens: Ich mache etwas sehr Ähnliches mit der Unterklasse einer Klasse, über die ich keine Kontrolle habe (dies ist der Hauptgrund, warum meine "Problemumgehung" keine Option ist).

Mit freundlichen Grüßen

War es hilfreich?

Lösung

Es ist (wohl) ein Fehler im Debugger. Sie können Ihre Stimme dazu hinzufügen Feedback -Artikel. Ich bin mir sicher, dass der Debugger nicht einfach zu beheben ist, da der Debugger keinen Vorgang auf die Adresse der Basis-Eigenschaft Getter-Methode hat, da der V-Table-Steckplatz für den Immobiliengesetz in der abgeleiteten Klasse ersetzt wurde.

Eine mögliche Problemumgehung besteht darin, den Basiswert zuerst in einer lokalen Variablen zu speichern, damit Sie diese untersuchen können. Das wird Ihren Getter nicht langsamer machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top