Модификатор new (Справочник по C#)

Обновлен: Ноябрь 2007

При использовании в качестве модификатора ключевое слово new явно скрывает члены, унаследованные от базового класса. При скрытии унаследованного члена его производная версия заменяет версию базового класса. Несмотря на то, что члены можно скрыть и без модификатора new, в результате возникнет предупреждение. Если new используется для явного скрытия члена, модификатор отключает вывод предупреждение и документирует тот факт, что производная версия предназначена для замены.

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

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

В этом примере BaseC.Invoke скрывается с помощью DerivedC.Invoke. Поле x не затрагивается, поскольку оно не скрыто похожим именем

Скрытие имени через наследование принимает одну из следующих форм.

  • Константа, поле, свойство или тип, представленные в классе или структуре, скрывают всех членов базового класса с одним именем.

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

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

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

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

Пример

В этом примере базовый класс BaseC и производный класс DerivedC используют одно и то же имя поля 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'.

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

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

Дополнительные сведения см. в следующем разделе документа Спецификация языка C#:

  • 10.3.4 Модификатор new

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Ключевые слова C#

Ключевые слова операторов (справочник по C#)

Модификаторы (Справочник по C#)

Другие ресурсы

Справочник по C#