Dela via


ny modifierare (C#-referens)

När det används som en deklarationsmodifierare döljer nyckelordet uttryckligen new en medlem som ärvs från en basklass. När du döljer en ärvd medlem ersätter den härledda versionen av medlemmen basklassversionen. Detta förutsätter att basklassversionen av medlemmen är synlig, eftersom den redan skulle vara dold om den markerades 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.

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 döljs av 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 introduceras i en klass eller struct alla basklassmedlemmar som delar dess namn. Det finns särskilda fall. Om du till exempel deklarerar ett nytt fält med namn N för att ha en typ som inte kan anropas och en bastyp deklarerar som en metod döljer det nya fältet inte basdeklarationen i anropssyntaxen N . Mer information finns i avsnittet Medlemssökning i C#-språkspecifikationen.

  • En metod som introduceras 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 introduceras 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 kommer programmet fortfarande att kompileras och köras, 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.

Se även