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 aanroepsyntaxisN
. 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 BaseC
en een afgeleide klasse DerivedC
dezelfde 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.