New — modyfikatorC# (odwołanie)new modifier (C# Reference)

Gdy jest używany jako modyfikator deklaracji, słowo kluczowe new jawnie ukrywa element członkowski, który jest Dziedziczony z klasy bazowej.When used as a declaration modifier, the new keyword explicitly hides a member that is inherited from a base class. W przypadku ukrycia dziedziczonego elementu członkowskiego wersja pochodna elementu członkowskiego zastępuje wersję klasy bazowej.When you hide an inherited member, the derived version of the member replaces the base class version. Chociaż można ukryć składowe bez używania modyfikatora new, zostanie wyświetlone ostrzeżenie kompilatora.Although you can hide members without using the new modifier, you get a compiler warning. Jeśli używasz new do jawnego ukrywania elementu członkowskiego, pomija to ostrzeżenie.If you use new to explicitly hide a member, it suppresses this warning.

Można również użyć słowa kluczowego new, aby utworzyć wystąpienie typu lub jako ograniczenie typu ogólnego.You can also use the new keyword to create an instance of a type or as a generic type constraint.

Aby ukryć dziedziczoną składową, zadeklaruj ją w klasie pochodnej przy użyciu tej samej nazwy elementu członkowskiego i zmodyfikuj ją za pomocą słowa kluczowego new.To hide an inherited member, declare it in the derived class by using the same member name, and modify it with the new keyword. Na przykład:For example:

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

W tym przykładzie BaseC.Invoke jest ukryta przez DerivedC.Invoke.In this example, BaseC.Invoke is hidden by DerivedC.Invoke. Nie ma to wpływ na x pola, ponieważ nie jest on ukryty przez podobną nazwę.The field x is not affected because it is not hidden by a similar name.

Nazwa ukrywając przy użyciu dziedziczenia ma jedną z następujących form:Name hiding through inheritance takes one of the following forms:

  • Ogólnie rzecz biorąc, stała, pole, właściwość lub typ, który jest wprowadzany w klasie lub strukturze ukrywa wszystkie elementy członkowskie klasy bazowej, które współdzielą swoją nazwę.Generally, a constant, field, property, or type that is introduced in a class or struct hides all base class members that share its name. Istnieją specjalne przypadki.There are special cases. Na przykład jeśli zadeklarujesz nowe pole o nazwie N tak, aby miało typ, który nie jest wywoływać, a typ podstawowy deklaruje N jako metodę, nowe pole nie ukrywa podstawowej deklaracji w składni wywołania.For example, if you declare a new field with name N to have a type that is not invocable, and a base type declares N to be a method, the new field does not hide the base declaration in invocation syntax. Aby uzyskać więcej informacji, zobacz sekcję odnośnik elementu członkowskiego C# specyfikacji języka.For more information, see the Member lookup section of the C# language specification.

  • Metoda wprowadzona w klasie lub strukturze ukrywa właściwości, pola i typy, które współużytkują tę nazwę w klasie bazowej.A method introduced in a class or struct hides properties, fields, and types that share that name in the base class. Ukrywa także wszystkie metody klasy bazowej, które mają taki sam podpis.It also hides all base class methods that have the same signature.

  • Indeksator wprowadzony w klasie lub strukturze ukrywa wszystkie indeksatory klasy bazowej, które mają taki sam podpis.An indexer introduced in a class or struct hides all base class indexers that have the same signature.

Wystąpił błąd zarówno new, jak i przesłonięcia dla tego samego elementu członkowskiego, ponieważ dwa Modyfikatory mają wzajemnie wykluczające się znaczenie.It is an error to use both new and override on the same member, because the two modifiers have mutually exclusive meanings. Modyfikator new tworzy nowy element członkowski o tej samej nazwie i powoduje, że oryginalny element członkowski staje się ukryty.The new modifier creates a new member with the same name and causes the original member to become hidden. Modyfikator override rozszerza implementację dziedziczonego elementu członkowskiego.The override modifier extends the implementation for an inherited member.

Użycie modyfikatora new w deklaracji, która nie ukrywa dziedziczonego elementu członkowskiego, generuje ostrzeżenie.Using the new modifier in a declaration that does not hide an inherited member generates a warning.

PrzykładExample

W tym przykładzie Klasa bazowa, BaseCi Klasa pochodna, DerivedC, Użyj tej samej nazwy pola x, która ukrywa wartość dziedziczonego pola.In this example, a base class, BaseC, and a derived class, DerivedC, use the same field name x, which hides the value of the inherited field. W przykładzie pokazano użycie modyfikatora new.The example demonstrates the use of the new modifier. Pokazano również, jak uzyskać dostęp do ukrytych elementów członkowskich klasy podstawowej przy użyciu ich w pełni kwalifikowanych nazw.It also demonstrates how to access the hidden members of the base class by using their fully qualified names.

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

PrzykładExample

W tym przykładzie Klasa zagnieżdżona ukrywa klasę o tej samej nazwie w klasie bazowej.In this example, a nested class hides a class that has the same name in the base class. W przykładzie pokazano, jak za pomocą modyfikatora new wyeliminować komunikat ostrzegawczy i jak uzyskać dostęp do ukrytych elementów członkowskich klasy przy użyciu ich w pełni kwalifikowanych nazw.The example demonstrates how to use the new modifier to eliminate the warning message and how to access the hidden class members by using their fully qualified names.

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

W przypadku usunięcia modyfikatora new program nadal kompiluje i uruchamia, ale otrzymasz następujące ostrzeżenie:If you remove the new modifier, the program will still compile and run, but you will get the following warning:

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

specyfikacja języka C#C# language specification

Aby uzyskać więcej informacji, zobacz sekcję New modyfikator w C# specyfikacji języka.For more information, see The new modifier section of the C# language specification.

Zobacz takżeSee also