Share via


nieuwe modifier (C#-verwijzing)

Wanneer het trefwoord wordt gebruikt als wijzigingsfunctie voor declaraties, verbergt het new trefwoord expliciet een lid dat wordt overgenomen van een basisklasse. Wanneer u een overgenomen lid verbergt, vervangt de afgeleide versie van het lid de basisklasseversie. Hierbij wordt ervan uitgegaan dat de basisklasseversie van het lid zichtbaar is, omdat deze al verborgen zou zijn als deze is gemarkeerd als private of, in sommige gevallen, internal. Hoewel u deze kunt verbergen public of protected leden zonder de new wijzigingsfunctie te gebruiken, krijgt u een waarschuwing van de compiler. Als u new een lid expliciet wilt verbergen, wordt deze waarschuwing onderdrukt.

U kunt ook het new trefwoord gebruiken om een exemplaar van een type of als een algemene typebeperking te maken.

Als u een overgenomen lid wilt verbergen, declareert u het in de afgeleide klasse met dezelfde lidnaam en wijzigt u het met het new trefwoord. Voorbeeld:

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

In dit voorbeeld BaseC.Invoke is verborgen door DerivedC.Invoke. Het veld x wordt niet beïnvloed omdat het niet wordt verborgen door een vergelijkbare naam.

Naam verbergen via overname heeft een van de volgende formulieren:

  • Over het algemeen verbergt een constante, veld, eigenschap of type dat wordt geïntroduceerd in een klasse of struct alle leden van de basisklasse die de naam delen. Er zijn speciale gevallen. Als u bijvoorbeeld een nieuw veld met de naam N declareert om een type te hebben dat niet kan worden aangeroepen en een basistype declareert een methode te zijn, verbergt het nieuwe veld de basisdeclaratie niet in de aanroepsyntaxis N . Zie de sectie Leden opzoeken van de C#-taalspecificatie voor meer informatie.

  • Een methode die is geïntroduceerd in een klasse of struct, verbergt eigenschappen, velden en typen die die naam in de basisklasse delen. Ook worden alle basisklassemethoden met dezelfde handtekening verborgen.

  • Een indexeerfunctie die is geïntroduceerd in een klasse of struct verbergt alle indexeerfuncties van basisklassen die dezelfde handtekening hebben.

Het is een fout om beide new en onderdrukkingen op hetzelfde lid te gebruiken, omdat de twee modifiers wederzijds uitsluitende betekenissen hebben. De new wijzigingsfunctie maakt een nieuw lid met dezelfde naam en zorgt ervoor dat het oorspronkelijke lid wordt verborgen. De override wijzigingsfunctie breidt de implementatie uit voor een overgenomen lid.

Als u de new wijzigingsfunctie gebruikt in een declaratie die een overgenomen lid niet verbergt, wordt er een waarschuwing gegenereerd.

Voorbeelden

In dit voorbeeld gebruiken een basisklasse BaseCen een afgeleide klasse DerivedCdezelfde veldnaam x, waarmee de waarde van het overgenomen veld wordt verborgen. In het voorbeeld ziet u het gebruik van de new modifier. Ook wordt gedemonstreerd hoe u de verborgen leden van de basisklasse kunt openen met behulp van hun volledig gekwalificeerde namen.

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 dit voorbeeld verbergt een geneste klasse een klasse met dezelfde naam in de basisklasse. In het voorbeeld ziet u hoe u de new wijzigingsfunctie gebruikt om het waarschuwingsbericht te elimineren en hoe u de verborgen klasseleden kunt openen met behulp van hun volledig gekwalificeerde namen.

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

Als u de new wijzigingsfunctie verwijdert, wordt het programma nog steeds gecompileerd en uitgevoerd, maar krijgt u de volgende waarschuwing:

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

C#-taalspecificatie

Zie de sectie Nieuwe wijzigingsfunctie van de C#-taalspecificatie voor meer informatie.

Zie ook