在引用继承的属性/变量时,使用this.X和base.X的行为有何不同?

时间:2014-02-06 11:45:29

标签: c#

如果我有一个非常简单的类,那么:

public class Example
{
    public int Number { get; set; }
    public Example(int numberArg)
    {
        this.Number = numberArg;
    }
}

我有一个像这样的派生类:

public class AnotherExample : Example
{
    public int DoubleNumber
    {
        get
        {
            return this.Number * 2;
        }
    }
    public AnotherExample(int numberArg) : base(numberArg) {}
}

如果我使用this.Number来引用AnotherExample对象基础Number属性,而不是使用base.Number来引用它,那么会有什么区别?

谢谢!

3 个答案:

答案 0 :(得分:3)

如果Number未被覆盖,则没有区别,因为this.Number将在继承链中正确解析。

这也意味着在基类中调用this.Member,如果在派生类中重写,将再次使用继承链并找到派生的实现。


如果已被覆盖,则使用base总是转到该属性的基类版本,而this.Number将首先转到您的被覆盖版本。

如果您打算在构建器内调用virtual成员,请注意围绕它的一般建议:

Virtual member call in a constructor

这个答案省略了关于成员隐藏的解释,因为OP示例比这简单。

答案 1 :(得分:2)

在这种情况下,没有区别。如果你覆盖它将采用基类的值而不是继承的类:

public class Example {
    public virtual int Number { get; set; }
    public Example(int numberArg) {
        this.Number = numberArg;
    }
}

public class AnotherExample : Example {
    public override int Number 
    {
        get{return 5;}
        set{}
    }
    public int DoubleNumber {
        get {
            return this.Number * 2; // returns 10
            return base.Number * 2 // returns 2 times whatever the value is 
        }
    }
    public AnotherExample(int numberArg) : base(numberArg) {}
}

答案 2 :(得分:1)

您可以在派生类中使用与基类中具有相同名称的变量。在这种情况下,您需要使用thisbase关键字以避免歧义。例如:

public class Base
{
    public int Number = 0;
}

public class Derived : Base
{
   public int Number;

   public Derived() 
   {
       this.Number = base.Number + 5;
   }
}