Sdílet prostřednictvím


nový modifikátor (Referenční dokumentace jazyka C#)

Pokud použijete new klíčové slovo jako modifikátor deklarace, explicitně skryjete člena, který poskytuje základní třída. Když skryjete zděděný člen, odvozená verze člena nahradí verzi základní třídy. Člena můžete skrýt, pokud je verze základní třídy viditelná v odvozené třídě. Verze základní třídy není viditelná, pokud je označená jako private nebo v některých případech internal. I když můžete skrýt public nebo protected členy bez použití modifikátoru new , zobrazí se upozornění kompilátoru. Pokud použijete new k explicitní skrytí člena, potlačí toto upozornění.

Referenční dokumentace jazyka C# dokumentuje naposledy vydané verze jazyka C#. Obsahuje také počáteční dokumentaci k funkcím ve verzi Public Preview pro nadcházející jazykovou verzi.

Dokumentace identifikuje všechny funkce, které byly poprvé představeny v posledních třech verzích jazyka nebo v aktuálních verzích Public Preview.

Návod

Informace o tom, kdy byla funkce poprvé představena v jazyce C#, najdete v článku o historii verzí jazyka C#.

Klíčové slovo můžete použít new také k vytvoření instance typu nebo jako omezení obecného typu.

Chcete-li skrýt zděděný člen, deklarujte jej v odvozené třídě pomocí stejného názvu členu a upravte ho klíčovým slovem new . Například:

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

V tomto příkladu BaseC.Invoke je skrytý pomocí DerivedC.Invoke. Toto pole x není ovlivněno, protože není skryto podobným názvem.

Skrytí názvu prostřednictvím dědičnosti má jednu z následujících forem:

  • Obecně platí, že konstanta, pole, vlastnost nebo typ, které zavádíte do třídy nebo struktury, skryje všechny členy základní třídy, které sdílejí jeho název. Existují však některé zvláštní případy. Pokud například deklarujete nové pole s názvem N tak, aby mělo typ, který není vyvolán, a základní typ deklaruje N , že se má jednat o metodu, nové pole neskryje základní deklaraci v syntaxi vyvolání. Další informace najdete v části Vyhledávání členůspecifikace jazyka C#.

  • Metoda, kterou zavedete do třídy nebo struktury, skryje vlastnosti, pole a typy, které sdílejí tento název v základní třídě. Také skryje všechny metody základní třídy, které mají stejný podpis.

  • Indexer, který zavádíte ve třídě nebo struktuře, skryje všechny indexery základní třídy, které mají stejný podpis.

Jedná se o chybu při použití obou new modifikátorů a přepsání u stejného členu, protože tyto dva modifikátory mají vzájemně se vylučující významy. new Modifikátor vytvoří nový člen se stejným názvem a způsobí skrytí původního člena. override Modifikátor rozšiřuje implementaci zděděného člena.

new Použití modifikátoru v deklaraci, která neskryje zděděný člen generuje upozornění.

Příklady

V tomto příkladu použijte základní třídu BaseCa odvozenou třídu DerivedCstejný název xpole, který skryje hodnotu zděděného pole. Příklad ukazuje použití modifikátoru new . Ukazuje také, jak přistupovat ke skrytým členům základní třídy pomocí jejich plně kvalifikovaných názvů.

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

V tomto příkladu vnořená třída skryje třídu se stejným názvem v základní třídě. Příklad ukazuje, jak pomocí modifikátoru new odstranit upozornění a jak získat přístup ke skrytým členům třídy pomocí jejich plně kvalifikovaných názvů.

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

Pokud modifikátor odeberete new , program se stále zkompiluje a spustí, ale zobrazí se následující upozornění:

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

Specifikace jazyka C#

Další informace naleznete v části Nový modifikátorspecifikace jazyka C#.

Viz také