Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
När du använder nyckelordet new som en deklarationsmodifierare döljer du uttryckligen en medlem som en basklass tillhandahåller. När du döljer en ärvd medlem ersätter den härledda versionen av medlemmen basklassversionen. Du kan dölja en medlem när basklassversionen visas i den härledda klassen. Basklassversionen visas inte om den är markerad som private eller i vissa fall internal. Även om du kan dölja public eller protected medlemmar utan att använda new modifieraren får du en kompilatorvarning. Om du använder new för att uttryckligen dölja en medlem undertrycks den här varningen.
C#-språkreferensen dokumenterar den senaste versionen av C#-språket. Den innehåller även inledande dokumentation för funktioner i offentliga förhandsversioner för den kommande språkversionen.
Dokumentationen identifierar alla funktioner som först introducerades i de tre senaste versionerna av språket eller i aktuella offentliga förhandsversioner.
Tips/Råd
Information om när en funktion först introducerades i C# finns i artikeln om språkversionshistoriken för C#.
Du kan också använda nyckelordet new för att skapa en instans av en typ eller som en allmän typbegränsning.
Om du vill dölja en ärvd medlem deklarerar du den i den härledda klassen med samma medlemsnamn och ändrar den med nyckelordet new . Till exempel:
public class BaseC
{
public int x;
public void Invoke() { }
}
public class DerivedC : BaseC
{
new public void Invoke() { }
}
I det här exemplet BaseC.Invoke döljs av DerivedC.Invoke. Fältet x påverkas inte eftersom det inte är dolt med ett liknande namn.
Namnet som döljs genom arv har något av följande formulär:
I allmänhet döljer en konstant, ett fält, en egenskap eller en typ som du introducerar i en klass eller struct alla basklassmedlemmar som delar dess namn. Det finns dock vissa särskilda fall. Om du till exempel deklarerar ett nytt fält med namn
Nför att ha en typ som inte är anropsbar och en bastyp deklarerar som en metod döljerNdet nya fältet inte basdeklarationen i anropssyntaxen. Mer information finns i avsnittet Medlemssökning i C#-språkspecifikationen.En metod som du introducerar i en klass eller struct döljer egenskaper, fält och typer som delar det namnet i basklassen. Den döljer också alla basklassmetoder som har samma signatur.
En indexerare som du introducerar i en klass eller struct döljer alla basklassindexerare som har samma signatur.
Det är ett fel att använda både new och åsidosätt på samma medlem, eftersom de två modifierarna har ömsesidigt uteslutande betydelser. Modifieraren new skapar en ny medlem med samma namn och gör att den ursprungliga medlemmen blir dold. Modifieraren override utökar implementeringen för en ärvd medlem.
new Om du använder modifieraren i en deklaration som inte döljer en ärvd medlem genereras en varning.
Exempel
I det här exemplet använder en basklass, BaseC, och en härledd klass, DerivedC, samma fältnamn x, som döljer värdet för det ärvda fältet. Exemplet visar hur modifieraren används new . Det visar också hur du får åtkomst till dolda medlemmar i basklassen med hjälp av deras fullständigt kvalificerade namn.
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
*/
I det här exemplet döljer en kapslad klass en klass som har samma namn i basklassen. Exemplet visar hur du använder new modifieraren för att eliminera varningsmeddelandet och hur du kommer åt de dolda klassmedlemmarna med hjälp av deras fullständigt kvalificerade namn.
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
*/
Om du tar bort new modifieraren kompilerar och körs programmet fortfarande, men du får följande varning:
The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.
Språkspecifikation för C#
Mer information finns i Avsnittet om nya modifierare i C#-språkspecifikationen.