C# 呼唤;“碱性吸气剂”;在重写属性的Getter时
我有这样一个基类“Parent”:C# 呼唤;“碱性吸气剂”;在重写属性的Getter时,c#,properties,virtual,overriding,getter,C#,Properties,Virtual,Overriding,Getter,我有这样一个基类“Parent”: using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class Parent { private int parentVirtualInt = -1; public virtual int VirtualProperty { g
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;
}
}
}
}
}
还有这样一个儿童班:
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;
}
}
}
}
}
注意,Child中的getter正在调用Parent的getter(或者至少这是我想要的)
我现在通过实例化“Child”类来使用它,为其VirtualProperty分配一个值(比如4),然后再次读取该属性
Child c = new Child();
c.VirtualProperty = 4;
Console.Out.WriteLine("Child.VirtualProperty: " + c.VirtualProperty);
当我运行这个程序时,我明显得到一个ApplicationException,上面写着“Dummy Ex”但是如果我在行上设置断点
if(base.VirtualProperty > 0)
在Child中,检查base.VirtualProperty
(将鼠标悬停在其上)的值。在抛出异常之前(我假设(d)),我已经得到了异常。由此,我传达了“Child Getter调用自身”中的语句base.VirtualProperty
;有点
我想要实现的是,当我将parentVirutalInt
(在Parent中)的定义更改为protected并在Child的Getter中使用base.parentVirtualInt
而不是base.VirtualProperty
时,我会得到相同的行为。我还不明白为什么这不起作用。有人能解释一下吗?我觉得被重写的属性的行为与被重写的方法不同
顺便说一下:我正在做一些非常类似的事情,对一个我无法控制的类进行子类化(这就是为什么我的“变通方法”不是一个选项的主要原因)
这(可以说)是调试器中的一个bug。你可以把你的票加到这上面。这不容易修复,我确信,调试器没有对基属性getter方法地址的现成访问权限,因为属性getter的v-table槽已在派生类中被替换
一种可能的解决方法是首先将基值存储在局部变量中,以便可以检查该局部变量。这不会让你的getter速度变慢