Share via


nieuwe modifier (C#-verwijzing)

Wanneer u het new trefwoord gebruikt als wijzigingsfunctie voor declaraties, verbergt u expliciet een lid dat een basisklasse biedt. Wanneer u een overgenomen lid verbergt, vervangt de afgeleide versie van het lid de basisklasseversie. U kunt een lid verbergen wanneer de basisklasseversie zichtbaar is in de afgeleide klasse. De basisklasseversie is niet zichtbaar 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.

De C#-taalreferentiedocumenten beschrijven de meest recent uitgebrachte versie van de C#-taal. Het bevat ook de eerste documentatie voor functies in openbare previews voor de aanstaande taalrelease.

De documentatie identificeert alle functies die voor het eerst zijn geïntroduceerd in de laatste drie versies van de taal of in de huidige openbare previews.

Aanbeveling

Raadpleeg het artikel over de versiegeschiedenis van de C#-taal om te achterhalen wanneer een functie voor het eerst is geïntroduceerd in C#.

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 die u in een klasse of struct introduceert alle leden van de basisklasse die de naam delen. Er bestaan echter enkele 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 u in een klasse of struct introduceert, verbergt eigenschappen, velden en typen die die naam in de basisklasse delen. Ook worden alle basisklassemethoden met dezelfde handtekening verborgen.

  • Een indexeerfunctie die u in een klasse of struct introduceert, verbergt alle indexeerfuncties van basisklassen met dezelfde handtekening.

Het is een fout om beide new en onderdrukkingen op hetzelfde lid te gebruiken, omdat de twee modifiers elkaar 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