C#和方法隐藏

4 c# methods method-hiding

根据MSDN,用于方法隐藏的"new"关键字仅抑制警告.

http://msdn.microsoft.com/en-us/library/435f1dw2.aspx

我真的需要这个"new"关键字来执行方法隐藏吗?如果我有一个具有相同方法名但没有明确说明它是覆盖的子类,那本质上不是同一个东西,我只是得到一个警告?如果我的理解是正确的,请告诉我.谢谢

Jon*_*eet 9

无论是否指定"new",您都会隐藏方法,但它与覆盖不同.这是一个他们不同的例子:

using System;

class Base
{
    public virtual void OverrideMe()
    {
        Console.WriteLine("Base.OverrideMe");
    }

    public virtual void HideMe()
    {
        Console.WriteLine("Base.HideMe");
    }
}

class Derived : Base
{
    public override void OverrideMe()
    {
        Console.WriteLine("Derived.OverrideMe");
    }

    public new void HideMe()
    {
        Console.WriteLine("Derived.HideMe");
    }
}

class Test
{
    static void Main()
    {
        Base x = new Derived();
        x.OverrideMe();
        x.HideMe();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Derived.OverrideMe
Base.HideMe
Run Code Online (Sandbox Code Playgroud)

即使基本HideMe方法是虚拟的,它也不会被覆盖Derived,它只是隐藏 - 所以该方法仍然绑定到虚拟方法中Base,这就是执行的方法.

隐藏成员通常是一个坏主意,使代码更难理解.这是事实可以在版本方面是有益的,但是-这意味着添加一个方法到基类没有可能让派生类重写它无意,他们可以跟以前一样工作.这就是你得到警告的原因.


Spe*_*nce 0

它是 C# 的一部分,就像 ref 和 out 一样。这个想法是警告您,您的 API 正在重写一个方法,该方法可能会影响依赖于您的类的子类/超类的代码。

放置 new 关键字会迫使您思考这是否真的是您想要做的事情,就像需要 ref 或 out 一样,以便您必须考虑代码提供的合同。