Поделиться через


новый модификатор (справочник по C#)

При использовании ключевого new слова в качестве модификатора объявления вы явно скрываете элемент, который предоставляет базовый класс. При скрытии унаследованного члена производная версия элемента заменяет версию базового класса. Элемент можно скрыть, когда версия базового класса отображается в производном классе. Версия базового класса не отображается, если она помечена как private или, в некоторых случаях. internal Хотя вы можете скрыть или public элементы protected без использования new модификатора, вы получите предупреждение компилятора. Если вы используете new для явного скрытия элемента, он подавляет это предупреждение.

Справочные документы по языку C# описывают последнюю выпущенную версию языка C#. Она также содержит начальную документацию по функциям в общедоступных предварительных версиях для предстоящего языкового выпуска.

Документация определяет любую функцию, впервые представленную в последних трех версиях языка или в текущих общедоступных предварительных версиях.

Подсказка

Чтобы узнать, когда функция впервые появилась в C#, ознакомьтесь со статьей об истории версий языка C#.

Ключевое new слово также можно использовать для создания экземпляра типа или в качестве ограничения универсального типа.

Чтобы скрыть унаследованный член, объявите его в производном классе с помощью того же имени члена и измените его с помощью ключевого new слова. Рассмотрим пример.

public class BaseC
{
    public int x;
    public void Invoke() { }
}
public class DerivedC : BaseC
{
    new public void Invoke() { }
}

В этом примере BaseC.Invoke скрыта DerivedC.Invoke. Поле x не затрагивается, так как оно не скрывается аналогичным именем.

Имя, скрываемое через наследование, принимает одну из следующих форм:

  • Как правило, константа, поле, свойство или тип, введенные в класс или структуру, скрывает все члены базового класса, которые разделяют его имя. Однако некоторые особые случаи существуют. Например, если вы объявляете новое поле с именем N , чтобы иметь тип, который не является неизменяемым, и базовый тип объявляется методом, новое поле не скрывает синтаксис вызова базового объявления N . Дополнительные сведения см. в разделе поиска участниковспецификации языка C#.

  • Метод, который вы вводите в класс или структуру, скрывает свойства, поля и типы, которые совместно используют это имя в базовом классе. Он также скрывает все методы базового класса, имеющие одинаковую сигнатуру.

  • Индексатор, который вы вводите в класс или структуру, скрывает все индексаторы базового класса, имеющие одинаковую сигнатуру.

Это ошибка для использования обоих new элементов и переопределения на одном элементе, так как два модификатора имеют взаимоисключающие значения. Модификатор new создает новый элемент с тем же именем и приводит к скрытию исходного элемента. Модификатор override расширяет реализацию для унаследованного элемента.

new Использование модификатора в объявлении, которое не скрывает унаследованный элемент, создает предупреждение.

Примеры

В этом примере базовый класс и производный класс BaseCDerivedCиспользуют то же имя xполя, которое скрывает значение унаследованного поля. В примере показано использование модификатора new . В нем также показано, как получить доступ к скрытым членам базового класса с помощью их полных имен.

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
*/

В этом примере вложенный класс скрывает класс, имеющий то же имя в базовом классе. В примере показано, как использовать new модификатор для устранения предупреждения и доступа к скрытым членам класса с помощью их полных имен.

public class BaseC
{
    public class NestedC
    {
        public int x = 200;
        public int y;
    }
}

public class DerivedC : BaseC
{
    // Nested type hiding the base type members.
    new public class NestedC
    {
        public int x = 100;
        public int y;
        public int z;
    }

    static void Main()
    {
        // Creating an object from the overlapping class:
        NestedC c1  = new NestedC();

        // Creating an object from the hidden class:
        BaseC.NestedC c2 = new BaseC.NestedC();

        Console.WriteLine(c1.x);
        Console.WriteLine(c2.x);
    }
}
/*
Output:
100
200
*/

Если удалить new модификатор, программа по-прежнему компилируется и выполняется, но вы получите следующее предупреждение:

The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.

Спецификация языка C#

Дополнительные сведения см. в разделе "Новый модификатор " спецификации языка C#.

См. также