You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#继承方法调用:是否需用base或this?最佳调用方式探讨(附示例)

在C#中继承方法调用:base vs this的那些事儿

嘿,这个问题问到点子上了,我给你拆解清楚:

一、是否必须使用base或this?

答案是不一定,分两种情况看:

  • 如果子类没有重写父类的方法,那调用这个继承来的方法时,写方法名、this.方法名、base.方法名这三种方式效果完全一致——编译器都会自动找到父类的实现。
  • 但如果子类重写了父类的虚方法/抽象方法,那区别就大了:
    • 直接写方法名或者用this.,调用的是子类自己重写后的版本;
    • 要是想调用父类原本的方法逻辑,那必须用base.,不然编译器默认会调用子类的重写版本,达不到你要的效果。

二、最佳调用方式是什么?

得根据你的调用意图来选:

  • 当你需要复用父类的方法逻辑(比如在子类重写的方法里先执行父类的逻辑,再加自己的逻辑),那必须用base.,这是唯一能准确调用父类原始实现的方式,没得商量。
  • 当子类没重写方法,只是调用继承来的方法:
    • 要是代码里没有命名冲突(比如没有和方法名一样的局部变量),直接写方法名就好,简洁清爽;
    • 要是怕可读性差,或者有命名冲突,用this.也没问题,能明确表示这是当前实例的方法;
    • 绝对不要没事就用base.,这会让看代码的人疑惑:“是不是子类有重写?为什么特意调用父类的?”平白增加理解成本。

举两个实际例子更清楚

例子1:子类没有重写父类方法

public class Parent
{
    public void ShowMessage()
    {
        Console.WriteLine("我是父类的消息");
    }
}

public class Child : Parent
{
    public void Display()
    {
        // 三种写法输出完全一样
        ShowMessage();
        this.ShowMessage();
        base.ShowMessage();
    }
}

例子2:子类重写了父类方法

public class Parent
{
    public virtual void ShowMessage()
    {
        Console.WriteLine("我是父类的消息");
    }
}

public class Child : Parent
{
    public override void ShowMessage()
    {
        Console.WriteLine("我是子类的消息");
    }

    public void DisplayAllMessages()
    {
        ShowMessage(); // 输出"我是子类的消息"
        this.ShowMessage(); // 和上面一样,调用子类版本
        base.ShowMessage(); // 输出"我是父类的消息"
    }
}

内容的提问来源于stack exchange,提问作者Martin Baychev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:22:15