c#访问this关键字和base关键字示例


在C#中,`this`关键字用于引用当前类的实例,而`base`关键字用于引用当前对象的基类。以下是一个简单的示例,展示了如何在C#中使用这两个关键字。

假设我们有一个基类`Animal`和一个从`Animal`派生的子类`Dog`。

### 基类 Animal


public class Animal
{
    public string Name { get; set; }

    public void MakeSound()
    {
        Console.WriteLine("Some generic animal sound");
    }
}

### 派生类 Dog


public class Dog : Animal
{
    // Dog 类自己的属性
    public int Age { get; set; }

    // 构造函数,使用 this 关键字调用同一类的另一个构造函数
    public Dog(string name) : this(name, 0)
    {
    }

    public Dog(string name, int age)
    {
        // 使用 this 关键字访问当前类的实例成员
        this.Name = name;
        this.Age = age;
    }

    // 覆盖基类的方法,使用 base 关键字调用基类的方法
    public new void MakeSound()
    {
        // 调用基类的 MakeSound 方法
        base.MakeSound();
        Console.WriteLine("Woof!");
    }

    // 另一个示例,演示如何在方法中使用 base 关键字
    public void Describe()
    {
        // 假设基类有一个 Describe 方法,这里用 base 调用它
        // 注意:在这个例子中,基类并没有 Describe 方法,只是为了演示
        // Console.WriteLine("This is a base class description."); // 假设这是基类的方法
        // base.Describe(); // 如果基类有这个方法的话

        // 但我们可以使用基类属性来演示
        Console.WriteLine($"This is a dog named {this.Name} and its age is {this.Age}.");
        // 接着,如果我们想要额外添加一些基类的信息(假设我们知道基类有什么),可以这样做:
        // 但在这个场景下,我们直接输出,因为基类没有 Describe 方法
    }
}

注意:

- `this` 关键字在构造函数链(如上例中的 `: this(name, 0)`)和访问当前类的成员时非常有用。

- `base` 关键字在覆盖基类方法或属性时调用基类实现时非常有用。

- 示例中的 `Describe` 方法实际上并没有直接调用基类的 `Describe` 方法,因为基类没有这个方法。它只是展示了如果基类有类似方法时如何使用 `base` 关键字。

- `new` 关键字在 `MakeSound` 方法前用于隐藏(而不是覆盖)基类中的同名方法。这意味着 `Dog` 类型的对象将调用 `Dog` 类中的 `MakeSound` 方法,而不是 `Animal` 类中的方法。如果你想要完全覆盖基类的方法(在面向对象术语中称为“重写”),并且想要在派生类中通过某些机制(如多态)调用基类的方法,则应该使用 `override` 和 `virtual` 关键字,而不是 `new`。然而,这超出了本示例的范围。