在覆盖虚拟属性时如何避免无限循环?

时间:2010-03-21 02:49:12

标签: c# .net

当我分配或检索值时,是否可以忽略set和get?

具体来说,我是从一个具有如下声明的属性的类继承的:

virtual public Int32 Value { get; set; }

我想做的是覆盖它并在那些设置和获取中做一些有用的事情。当我覆盖它时出现问题,我还必须手动分配,或从属性返回值。如果我做这样的事情:

override public Int32 Value
{
    get
    {
        return this.Value;
    }
    set
    {
        this.Value = value;
        // do something useful
    }

然后我创造了一个无限循环。有没有办法在不调用set和get中的代码的情况下设置或获取值,或者我是否必须为实际变量创建单独的名称?

2 个答案:

答案 0 :(得分:6)

您应该使用this.Value,而不是使用base.Value。这将检索/设置基类中的属性。

请注意,基本方法实际上必须是可覆盖的(virtualabstract);在你的例子中,它不是。如果基本方法不是虚拟的,那么当您尝试在派生类中重写时,您将只会遇到编译器错误。

答案 1 :(得分:1)

您所关注的关键字是basedocumented here。这会强制编译器将属性引用解析为基类中定义的属性引用。 VB.NET等效项是MyBase。

因此:

get 
{ 
    return base.Value; 
} 
set 
{ 
    base.Value = value; 
    // do something useful 
}