財産のオーバーライドゲッターで「ベースゲッター」と呼んでいます
-
20-09-2019 - |
質問
私はこのような基本クラスの「親」を持っています:
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;
}
}
}
}
}
そして、このような子供のクラス:
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;
}
}
}
}
}
子供のゲッターは親のゲッターを呼んでいることに注意してください(または、少なくともこれは私が意図していることです)。
私は今、それをインスタンス化して「子」クラスを使用して、VirtualPropertyに値(たとえば4)を割り当ててから、再びプロパティを読み取ります。
Child c = new Child();
c.VirtualProperty = 4;
Console.Out.WriteLine("Child.VirtualProperty: " + c.VirtualProperty);
これを実行すると、明らかに「ダミーEx」というApplicationExceptionが表示されます。 しかし ラインにブレークポイントを設定した場合
if(base.VirtualProperty > 0)
子供で、の価値を確認します base.VirtualProperty
(その上にマウスをホバリングすることによって) 例外をスローする前に ((d))、私はすでに例外を取得しています。これから私はその声明を伝えます base.VirtualProperty
「子どもが自らを呼び出す」で;すこし。
私が達成したいのは、の定義を変更するときに得られるのと同じ動作です parentVirutalInt
(親で)保護および使用 base.parentVirtualInt
代わりに子供のゲッターで base.VirtualProperty
. 。そして、なぜこれが機能していないのかはまだわかりません。誰かがこれに光を当てることができますか?オーバーライドされたプロパティは、オーバーライドされた方法とは異なる動作をしていると感じていますか?
ちなみに、私はクラスをサブクラス化することで非常によく似たことをしています。
敬具
解決
それは(間違いなく)デバッガーのバグです。これに投票を追加できます フィードバック記事. 。これは簡単に修正できません。デバッガーは、プロパティゲッターのVテーブルスロットが派生クラスに置き換えられているため、ベースプロパティメソッドアドレスにすぐにアクセスできないと確信しています。
考えられる回避策の1つは、最初にローカル変数に基本値を保存して、それを検査できることです。それはあなたのゲッターを遅くすることではありません。