Share via


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

Deklarációs módosítóként használva a new kulcsszó kifejezetten elrejti az alaposztályból öröklő tagot. Ha elrejt egy öröklött tagot, a tag származtatott verziója lecseréli az alaposztály verzióját. Ez azt feltételezi, hogy a tag alaposztály-verziója látható, mivel az már rejtve lenne, ha a tag megjelölése private vagy bizonyos esetekben. internal Bár a módosító használata nélkül elrejtheti vagy protected elrejtheti public a new tagokat, a fordító figyelmeztetést kap. Ha new kifejezetten el szeretne rejteni egy tagot, az letiltja ezt a figyelmeztetést.

A kulcsszóval newlé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élda:

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 hasonló név.

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

  • Egy osztályban vagy szerkezetben bevezetett állandó, mező, tulajdonság vagy típus általában elrejti a nevét megosztó összes alaposztálytagot. Vannak különleges esetek. Ha például egy új, névvel N rendelkező mezőt nem visszavonható típusnak deklarál, és az alaptípus metódusnak deklarálódik 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ának Tagkeresés szakasza.

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

  • Egy 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 eredményez.

Példák

Ebben a példában egy alaposztály BaseCés egy származtatott osztály ugyanazt a mezőnevet xhasználja, DerivedCamely 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 lefordítja és futtatja, de a következő figyelmeztetés jelenik meg:

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