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

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

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

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

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

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

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

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

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

 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"); } } 

看看这个

 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() {} } 

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

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

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

有关更多信息,请参阅新修饰符(C#)