restriccion - que significa new en c#
¿Cuál es el punto del modificador "estático nuevo" para una función? (4)
Hoy, encontré algo en el código legado. Tiene "nueva estática" para una función. Se parece a esto.
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 estático para el método Do en la barra de clases. En C #, el método estático solo puede invocarse con el nombre de la clase en lugar del nombre del objeto. Por lo tanto, no creo que haya ninguna diferencia entre tener lo "nuevo" y no tenerlo.
En general, si alguna sintaxis es innecesaria, C # simplemente trata que es un error. ¿Alguien tiene alguna idea de por qué C # permite tal sintaxis?
Echa 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 */
Tu ejemplo, para dejarlo claro, debe ser
public class Foo
{
public static void Do() {}
}
public class Bar :Foo
{
public new static void Do() {}
}
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 modificador "nuevo" oculta explícitamente la versión de 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á pensado como un reemplazo para la versión de la clase base de Do()
.
Para más información, ver nuevo modificador (C #)
Eso se aplica sólo para los llamadores externos. Recuerde que puede llamar a un método estático de la clase base, por lo 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();
}
}
Por esta razón, la advertencia le indica que coloque lo nuevo; desea 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"); }
}
Si eliminas lo nuevo de tu código obtienes:
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 tenía la intención y le pide que inserte la nueva palabra clave para confirmar que sabe lo que está haciendo. Además de suprimir la advertencia, no tiene otros efectos.