Какой смысл в модификаторе «статический новый» для функции?

StackOverflow https://stackoverflow.com/questions/661246

Вопрос

Сегодня я нашел что -то в устаревшем коде. Он имеет «статический новый» для одной функции. Похоже, это.

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# позволяет такой синтаксис?

Это было полезно?

Решение

Если вы удалите новый Из своего кода вы получаете:

ПРЕДУПРЕЖДЕНИЕ CS0108: 'bar.do ()' скрывает унаследованный член 'foo.do ()'. Используйте новое ключевое слово, если укрытие было предназначено.

Компилятор 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() {}
}

В вашем примере второй класс, похоже, не наследует от Foo. Кажется, это опечатка, потому что в противном случае это не имеет смысла.

Предполагая, что это опечатка, «новый» модификатор явно скрывает версию базового класса функции Do(). Анкет Это означает, что производная версия Do() Метод эффективно заменяет версию базового класса.

Использование «нового» здесь документирует тот факт, что унаследованный метод предназначен в качестве замены для базового класса версии Do().

Для получения дополнительной информации см. новый модификатор (C#)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top