Condividi tramite


Modificatore new (Riferimenti per C#)

Se utilizzata come modificatore di dichiarazione, la parola chiave new nasconde in modo esplicito un membro ereditato da una classe base. Quando si nasconde un membro ereditato, la versione derivata del membro sostituisce la versione della classe base. Sebbene sia possibile nascondere i membri senza utilizzare il modificatore new, viene visualizzato un avviso del compilatore. Se si utilizza new in modo esplicito per nascondere un membro, esso elimina l'avviso.

Per nascondere un membro ereditato, dichiararlo nella classe derivata utilizzando lo stesso nome di membro e modificarlo con la parola chiave new. Ad esempio:

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

In questo esempio BaseC.Invoke è nascosto da DerivedC.Invoke. Il campo x non è interessato perché non è nascosto da un nome simile.

Un nome nascosto tramite ereditarietà accetta uno dei formati seguenti:

  • In genere, una costante, un campo, una proprietà o un tipo introdotto in una classe o uno struct nasconde tutti i membri della classe base che condividono il nome. Esistono casi particolari. Se, ad esempio, si dichiara che un nuovo campo con il nome N dispone di un tipo non richiamabile e un tipo di base dichiara che N sia un metodo, il nuovo campo non nasconde la dichiarazione di base nella sintassi di chiamata. Per informazioni dettagliate, vedere la Specifica del linguaggio C# (vedere "Ricerca di membri" nella sezione "Espressioni").

  • Un metodo inserito in una classe o uno struct nasconde proprietà, campi e tipi che condividono il nome con la classe base. Nasconde inoltre tutti i metodi della classe base con la stessa firma.

  • Un indicizzatore inserito in una classe o uno struct nasconde tutti gli indicizzatori della classe base con la stessa firma.

Non è possibile utilizzare sia new sia override sullo stesso membro, in quanto i significati dei due modificatori si escludono reciprocamente. Il modificatore new crea un nuovo membro con lo stesso nome e fa sì che il membro originale venga nascosto. Il modificatore override estende l'implementazione per un membro ereditato.

L'utilizzo del modificatore new in una dichiarazione che non nasconde un membro ereditato genera un avviso.

Esempio

In questo esempio, una classe base, BaseC, e una classe derivata, DerivedC, utilizzano lo stesso nome di campo x, che nasconde il valore del campo ereditato. Nell'esempio viene illustrato l'utilizzo del modificatore new. Viene inoltre descritto come accedere ai membri nascosti della classe base utilizzando i relativi nomi completi.

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

In questo esempio, una classe annidata nasconde una classe che ha lo stesso nome nella classe base. L'esempio illustra come utilizzare il modificatore new per eliminare il messaggio di avviso e come accedere ai membri di classe nascosti tramite i relativi nomi completi.

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

Se si rimuove il modificatore new, la compilazione e l'esecuzione del programma saranno comunque possibili, ma verrà visualizzato il messaggio di avviso riportato di seguito:

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

Specifiche del linguaggio C#

Per altre informazioni, vedere la Specifiche del linguaggio C#. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.

Vedere anche

Riferimenti

Parole chiave di C#

Parole chiave per operatori (Riferimenti per C#)

Modificatori (Riferimenti per C#)

Controllo delle versioni con le parole chiave Override e New (Guida per programmatori C#)

Sapere quando utilizzare le parole chiave Override e New (Guida per programmatori C#)

Concetti

Guida per programmatori C#

Altre risorse

Riferimenti per C#