【问题标题】:Implicit and explicit method hiding隐式和显式方法隐藏
【发布时间】:2025-12-11 03:35:01
【问题描述】:

我有以下两个用例:

class BaseCalculator
{
    public int Sum(int x, int y)
    {
        return x + y;
    }   
}

class Calculator : BaseCalculator
{
    public new int Sum ( int x , int y )
    {
        return x + y;
    }
}

这确实使用new 关键字显式隐藏了Sum 方法。

class BaseCalculator
{
    public int Sum(int x, int y)
    {
        return x + y;
    }
}

class Calculator : BaseCalculator
{
    public int Sum ( int x , int y )
    {
        return x + y;
    }
}

我不明白两者之间的区别。第二个代码是否隐式隐藏了 Sum 方法?

【问题讨论】:

  • 是的,它隐式隐藏了基类的 Sum 方法。这仍然非常糟糕(我认为会产生警告?) - 在这种情况下始终使用 new 或 override 。这将清楚您的意图是什么,并且您并没有忘记它。
  • 区别在于你的编译器输出窗口,使用new时少了1个警告。

标签: c# method-hiding


【解决方案1】:

来自MSDN documentation

在 C# 中,派生类可以包含与基类方法同名的方法。如果派生类中的方法以 new 关键字开头,则该方法被定义为独立于基类中的方法。

为什么这两个代码段相同,解释如下:

使用 new 关键字告诉编译器您的定义隐藏了基类中包含的定义。这是默认行为。

唯一的区别是使用new 关键字可以避免编译器警告。

更多解释也可以在Knowing When to Use Override and New Keywords (C# Programming Guide)的MSDN上找到。

【讨论】:

    【解决方案2】:

    是的。没有语义差异。 new 关键字只是强调隐藏。它类似于private 修饰符的行为。成员默认是私有的,但你可以写private

    【讨论】: