当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《函数的"静态新"修饰符有什么意义?》经验,为你挑选了3个好方法。

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

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#允许这样的语法?



1> Rasmus Faber..:

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

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

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


值得注意的是,_only_抑制了一个警告.没有其他影响.
虽然它只是抑制警告,但它使意图明确(避免任何混淆),检查我的答案

2> eglasius..:

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

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



3> Andreas Nied..:

看看这个

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

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有