új módosító (C# referencia)

Ha a new kulcsszót deklarációs módosítóként használja, explicit módon elrejti az alaposztály által biztosított tagot. Ha elrejt egy öröklött tagot, a tag származtatott verziója lecseréli az alaposztály verzióját. Elrejthet egy tagot, ha az alaposztály verziója látható a származtatott osztályban. Az alaposztály verziója nem látható, ha azt jelöli private , vagy bizonyos esetekben internal. Bár a módosító használata nélkül elrejtheti vagy public elrejtheti protected a new tagokat, a fordító figyelmeztetést kap. Ha new kifejezetten el szeretne rejteni egy tagot, az letiltja ezt a figyelmeztetést.

A C# nyelv referenciadokumentuma a C# nyelv legújabb kiadású verzióját ismerteti. Emellett a közelgő nyelvi kiadás nyilvános előzetes verziójú funkcióinak kezdeti dokumentációját is tartalmazza.

A dokumentáció azonosítja azokat a funkciókat, amelyeket először a nyelv utolsó három verziójában vagy az aktuális nyilvános előzetes verziókban vezetnek be.

Jótanács

Ha meg szeretné tudni, hogy mikor jelent meg először egy funkció a C#-ban, tekintse meg a C# nyelvi verzióelőzményeiről szóló cikket.

A kulcsszóval new létrehozhat egy típuspéldányt , vagy általános típuskényszerként is.

Az örökölt tag elrejtéséhez deklarálja a származtatott osztályban ugyanazzal a tagnévvel, és módosítsa a new kulcsszóval. Például:

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

Ebben a példában BaseC.Invoke a rejtett DerivedC.Invoke. A mezőre x nincs hatással, mert nem rejti el egy hasonló név.

Az öröklés során elrejtett név az alábbi űrlapok egyikét használja:

  • Az osztályban vagy szerkezetben bevezetett állandó, mező, tulajdonság vagy típus általában elrejti az összes olyan alaposztálytagot, amely megosztja a nevét. Vannak azonban különleges esetek. Ha például egy új, névvel N rendelkező mezőt nem visszavonhatatlan típusnak deklarál, és egy alaptípus metódusnak deklarálható N , az új mező nem rejti el az alapdeklarációt a meghívás szintaxisában. További információ: A C# nyelv specifikációjánakTagkeresés szakasza.

  • Egy osztályban vagy szerkezetben bevezetett metódus elrejti azokat a tulajdonságokat, mezőket és típusokat, amelyek megosztják ezt a nevet az alaposztályban. Emellett elrejti az azonos aláírású alaposztály-metódusokat is.

  • Az osztályban vagy szerkezetben bevezetett indexelő elrejti az összes olyan alaposztály-indexelőt, amely ugyanazzal az aláírással rendelkezik.

Hiba mindkettőt és felülbírálást használni new ugyanazon a tagon, mert a két módosítónak kölcsönösen kizáró jelentése van. A new módosító létrehoz egy új tagot ugyanazzal a névvel, és az eredeti tag el van rejtve. A override módosító kibővíti az örökölt tag implementációját.

new A módosító olyan deklarációban való használata, amely nem rejt el öröklött tagokat, figyelmeztetést hoz létre.

Példák

Ebben a példában egy alaposztály BaseCés egy származtatott osztály ugyanazt a mezőnevet DerivedChasználja, xamely elrejti az örökölt mező értékét. A példa a módosító new használatát mutatja be. Azt is bemutatja, hogyan érheti el az alaposztály rejtett tagjait teljes névvel.

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

Ebben a példában egy beágyazott osztály elrejt egy olyan osztályt, amelynek ugyanaz a neve az alaposztályban. A példa bemutatja, hogyan használható a módosító a new figyelmeztető üzenet eltávolítására, és hogyan érheti el a rejtett osztálytagokat a teljes névvel.

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

Ha eltávolítja a new módosítót, a program továbbra is fordít és fut, de a következő figyelmeztetést kapja:

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

C# nyelvspecifikáció

További információ: A C# nyelv specifikációjánakúj módosító szakasza.

Lásd még