Mor*_*eng 30 c# static modifier new-operator
今天,我在遗留代码中找到了一些东西.它具有一个功能的"静态新".看起来像这样.
class Foo
{
public static void Do()
{
Console.WriteLine("Foo.Do");
}
}
class Bar: Foo
{
public static new void Do()
{
Console.WriteLine("Bar.Do");
}
}
Run Code Online (Sandbox Code Playgroud)
我不理解类Bar中的Do方法的静态new修饰符.在C#中,静态方法只能使用类名而不是对象名来调用.因此,我认为拥有"新"与否之间没有任何区别.
通常,如果某些语法不必要,C#只会将其视为错误.任何人都知道为什么C#允许这样的语法?
Ras*_*ber 43
如果从代码中删除新代码,则会得到:
警告CS0108:'Bar.Do()'隐藏继承的成员'Foo.Do()'.如果要隐藏,请使用new关键字.
C#编译器只是警告您,您可能正在做一些您不想要的事情,并要求您插入新关键字以确认您知道自己在做什么.除了抑制警告外,它没有其他影响.
egl*_*ius 13
这仅适用于外部呼叫者.请记住,您可以调用基类的静态方法,因此这样的内容是有效的:
class Foo
{
public static void Do() { Console.WriteLine("Foo.Do"); }
}
class Bar : Foo // :Foo added
{
public static void Something()
{
Do();
}
}
Run Code Online (Sandbox Code Playgroud)
这就是为什么警告告诉你把新的,你想避免在这样做时的任何混淆:
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"); }
}
Run Code Online (Sandbox Code Playgroud)
看看这个
Run Code Online (Sandbox Code Playgroud)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() {}
}
Run Code Online (Sandbox Code Playgroud)