Partager via


new, modificateur (référence C#)

En cas d'utilisation comme un modificateur, le mot clé new masque explicitement un membre hérité d'une classe de base. Lorsque vous masquez un membre hérité, la version dérivée du membre remplace la version de classe de base. Bien que vous puissiez masquer des membres sans utiliser le modificateur new, le résultat est un avertissement. L'utilisation de new pour masquer un membre explicitement supprime cet avertissement, et documente le fait que la version dérivée est destinée à être un remplacement.

Pour masquer un membre hérité, déclarez-le dans la classe dérivée en utilisant le même nom, puis modifiez-le à l'aide du modificateur new. Par exemple :

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

Dans cet exemple, BaseC.Invoke est masqué par DerivedC.Invoke. Le champ x n'est pas affecté parce qu'il n'est pas masqué par un nom semblable.

Le masquage de noms par le biais de l'héritage peut prendre l'une des formes suivantes :

  • Une constante, un champ, une propriété ou un type introduit dans une classe ou un struct masque tous les membres de la classe de base avec le même nom.

  • Une méthode introduite dans une classe ou un struct masque les propriétés, les champs et les types, avec le même nom, dans la classe de base. Cela masque également toutes les méthodes de la classe de base ayant la même signature.

  • Un indexeur introduit dans une classe ou un struct masque tous les indexeurs de la classe de base ayant la même signature.

L'utilisation de new et deoverride sur le même membre est une erreur, car les deux modificateurs ont des significations mutuellement exclusives. Le modificateur new crée un nouveau membre avec le même nom et entraîne le masquage du membre d'origine. Le modificateur override étend l'implémentation pour un membre hérité.

L'utilisation du modificateur new dans une déclaration qui ne masque pas un membre hérité génère un avertissement.

Exemple

Dans cet exemple, une classe de base, BaseC, et une classe dérivée, DerivedC, utilisent le même nom de champ x, masquant ainsi la valeur du champ hérité. Cet exemple illustre l'utilisation du modificateur new. Il montre aussi comment accéder aux membres masqués de la classe de base en utilisant leurs noms complets.

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

Dans cet exemple, une classe imbriquée masque une classe du même nom dans la classe de base. Cet exemple illustre l'utilisation du modificateur new pour éliminer le message d'avertissement, ainsi que l'accès aux membres de la classe masquée à l'aide de leurs noms complets.

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

Si vous supprimez le modificateur new, le programme peut encore être compilé et exécuté, mais vous obtiendrez l'avertissement suivant :

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

Spécification du langage C#

Pour plus d'informations, consultez la Spécification du langage C#. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.

Voir aussi

Référence

Mots clés C#

Mots clés des opérateurs (référence C#)

Modificateurs (référence C#)

Concepts

Guide de programmation C#

Autres ressources

Référence C#