2009-03-19 12 views
21

Hoy encontré algo en el código heredado. Tiene "estático nuevo" para una función. Se parece a esto.¿Cuál es el punto del modificador "estático nuevo" para una función?

class Foo 
{ 
    public static void Do() 
    { 
     Console.WriteLine("Foo.Do"); 
    } 
} 

class Bar: Foo 
{ 
    public static new void Do() 
    { 
     Console.WriteLine("Bar.Do"); 
    } 
} 

No entiendo el nuevo modificador staticpara el método hacer en clase Bar. En C#, el método estático solo se puede invocar con el nombre de clase en lugar del nombre del objeto. Entonces, no creo que haya ninguna diferencia entre tener lo "nuevo" y no.

En general, si alguna sintaxis es innecesaria, C# solo tratar es un error. ¿Alguien tiene alguna idea sobre por qué C# permite esa sintaxis?

Respuesta

37

Si se quita la nueva a partir del código que se obtiene:

advertencia CS0108: 'Bar.Do()' oculta el miembro heredado 'Foo.Do()'. Usa la nueva palabra clave si te intentabas esconder.

El compilador de C# simplemente le advierte que podría estar haciendo algo que no tiene la intención y le pide que introduzca el nuevo palabra clave para confirmar que usted sabe lo que está haciendo. Además de suprimir la advertencia, no tiene otros efectos.

+12

Vale la pena señalar que _sólo_ suprime una advertencia. Sin otros efectos –

+0

Buen punto. Yo agregué eso al anwer. –

+4

mientras solo suprime la advertencia, hace que la intención sea explícita (para evitar cualquier confusión), verifique mi respuesta – eglasius

7

echar un vistazo a this

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

Su ejemplo, para que quede claro, debería ser

public class Foo 
{ 
    public static void Do() {} 
} 
public class Bar :Foo 
{ 
    public new static void Do() {} 
} 
4

En su ejemplo, la barra de segunda clase no parece heredar de Foo. Esto parece ser un error tipográfico porque de otra manera no tiene sentido.

Suponiendo que sea un error tipográfico, el "nuevo" modificador oculta explícitamente la versión de la clase base de la función Do(). Esto significa que la versión derivada del método Do() reemplaza efectivamente la versión de la clase base.

El uso de "nuevo" aquí documenta el hecho de que el método heredado está destinado a reemplazar la versión de clase base de Do().

Para obtener más información, ver new Modifier (C#)

+0

Aquí está la documentación actualizada del [nuevo modificador] (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/new-modifier). – zodo

10

que se aplica sólo para las llamadas externas. Recuerde que puede llamar a un método estático de la clase base, así que algo como esto es válido:

class Foo 
{ 
    public static void Do() { Console.WriteLine("Foo.Do"); } 
} 
class Bar : Foo // :Foo added 
{ 
    public static void Something() 
    { 
     Do(); 
    } 
} 

Esta es la razón por la advertencia que le dice que ponga el nuevo, se quiere evitar cualquier confusión al hacer esto:

class Foo 
{ 
    public static void Do() { Console.WriteLine("Foo.Do"); } 
} 
class Bar : Foo // :Foo added 
{ 
    public static void Something() 
    { 
     Do(); 
    } 
    public static new void Do() { Console.WriteLine("Bar.Do"); } 
} 
Cuestiones relacionadas