函数的“静态新”修饰符有什么意义?

时间:2009-03-19 06:38:26

标签: c# static new-operator modifier

今天,我在遗留代码中找到了一些东西。它具有一个功能的“静态新”。它看起来像这样。

class Foo
{
    public static void Do()
    {
        Console.WriteLine("Foo.Do");
    }
}

class Bar: Foo
{
    public static new void Do()
    {
        Console.WriteLine("Bar.Do");
    }
}

我不理解执行方法的 静态新 修饰符。在C#中,静态方法只能使用类名而不是对象名来调用。因此,我认为拥有“新”与否之间没有任何区别。

通常,如果不需要某些语法,C#只会将其视为错误。 任何人都知道为什么C#允许这样的语法?

4 个答案:

答案 0 :(得分:41)

如果您从代码中删除,则会获得:

  

警告CS0108:'Bar.Do()'隐藏继承的成员'Foo.Do()'。如果想要隐藏,请使用new关键字。

C#编译器只是警告您,您可能正在做一些您不打算做的事情,并要求您插入 new 关键字以确认您知道自己在做什么。除了抑制警告外,它没有其他影响。

答案 1 :(得分:13)

这仅适用于外部呼叫者。请记住,您可以调用基类的静态方法,因此这样的内容是有效的:

class Foo
{
    public static void Do() { Console.WriteLine("Foo.Do"); }
}
class Bar : Foo // :Foo added
{
    public static void Something()
    {
        Do();
    }
}

这就是为什么警告告诉你把新的,你想避免在这样做时的任何混淆:

class Foo
{
    public static void Do() { Console.WriteLine("Foo.Do"); }
}
class Bar : Foo // :Foo added
{
    public static void Something()
    {
        Do();
    }
    public static new void Do() { Console.WriteLine("Bar.Do"); }
}

答案 2 :(得分:7)

查看this

public class BaseC
{
    public static int x = 55;
    public static int y = 22;
}

public class DerivedC : BaseC
{
    // Hide field 'x'.
    new public static int x = 100;

    static void Main()
    {
        // Display the new value of x:
        Console.WriteLine(x);

        // Display the hidden value of x:
        Console.WriteLine(BaseC.x);

        // Display the unhidden member y:
        Console.WriteLine(y);
    }
}
/*
Output:
100
55
22
*/

为了说清楚,你的例子应该是

public class Foo
{
    public static void Do() {}
}
public class Bar :Foo
{
    public new static void Do() {}
}

答案 3 :(得分:4)

在您的示例中,第二类Bar似乎不会从Foo继承。这似乎是一个错字,因为它没有其他意义。

假设它是一个拼写错误,“new”修饰符显式隐藏函数Do()的基类版本。这意味着Do()方法的派生版本有效地替换了基类版本。

在此使用“new”记录了继承方法旨在替代Do()的基类版本的事实。

有关详细信息,请参阅new Modifier (C#)