typeparam example cref c#

example - ¿Diferencia entre sombreado y anulación en C#?



summary example c# (5)

Básicamente, si tienes algo como a continuación,

Class A { } Class B:A { } A a = new B();

Cualquier método que invoque en el objeto ''a'' se hará en el tipo de ''a'' (Aquí el tipo es ''A'') Pero si implementa el mismo método en la clase B que ya está presente en la Clase A, el compilador darle una advertencia para usar una palabra clave "Nuevo". Si usa "Nuevo", la advertencia desaparecerá. Aparte de esto, no hay diferencia entre usar "Nuevo" o no usarlo en la clase heredada.

En algunas situaciones, puede necesitar llamar a un método de la clase de referencia que la instancia particular contiene en ese momento en lugar de llamar a un método en el tipo de objeto. En el caso anterior, la referencia que contiene es ''B'', pero el tipo es ''A''. Por lo tanto, si desea que la llamada al método se realice en ''B'', use Virtual y anule para lograr esto.

Espero que esto ayude...

Daniel Sandeep.

¿Cuál es la diferencia entre sombrear y anular un método en C #?


Bien herencia ...

supongamos que tiene estas clases:

class A { public int Foo(){ return 5;} public virtual int Bar(){return 5;} } class B : A{ public new int Foo() { return 1;} //shadow public override int Bar() {return 1;} //override }

luego cuando llamas esto:

A clA = new A(); B clB = new B(); Console.WriteLine(clA.Foo()); // output 5 Console.WriteLine(clA.Bar()); // output 5 Console.WriteLine(clB.Foo()); // output 1 Console.WriteLine(clB.Bar()); // output 1 //now let''s cast B to an A class Console.WriteLine(((A)clB).Foo()); // output 5 <<<-- shadow Console.WriteLine(((A)clB).Bar()); // output 1

Supongamos que tiene una clase base y usa la clase base en todo su código en lugar de las clases heredadas, y usa shadow, devolverá los valores que devuelve la clase base en lugar de seguir el árbol de herencia del tipo real del objeto.

Ejecutar código aquí

Espero que tenga sentido :)


Creo que la principal diferencia es que con el sombreado, básicamente estás reutilizando el nombre, e ignorando el uso de la clase superior. Con la anulación, está cambiando la implementación, pero no la accesibilidad y la firma (por ejemplo, tipos de parámetros y devolución). Ver http://www.geekinterview.com/question_details/19331 .


El sombreado es en realidad el lenguaje de realidad virtual para lo que nos referiríamos a esconderse en C #.

A menudo, muestra la respuesta oculta (sombreado en VB) y anulación.

Se muestra que un método virtual está anulado por una subclase y las llamadas a ese método incluso en el tipo de superclase o desde el código interno de la superclase llamarán a la implementación de reemplazo de la subclase.

Luego se muestra un método concreto (uno que no está marcado como virtual o abstracto) oculto al usar la new palabra clave cuando se define un método con una firma idéntica en la subclase. En este caso, cuando se llama al método en el tipo de superclase, se utiliza la implementación original, la nueva implementación solo está disponible en la subclase.

Sin embargo, lo que a menudo se pierde es que también es posible ocultar un método virtual.

class A { public virtual void DoStuff() { // original implementation } } class B : A { public new void DoStuff() { //new implementation } } B b = new B(); A a = b; b.DoStuff(); //calls new implementation a.DoStuff(); //calls original implementation.

Nota en el ejemplo anterior DoStuff se vuelve concreto y no puede ser anulado. Sin embargo, también es posible usar tanto las palabras clave virtual como las new .

class A { public virtual void DoStuff() { // original implementation } } class B : A { public new virtual void DoStuff() { //new implementation } } class C : B { public override void DoStuff() { //replacement implementation } } C c = new C(); B b = c; A a = b; c.DoStuff(); //calls replacement implementation b.DoStuff(); //calls replacement implementation a.DoStuff(); //calls original implementation.

Tenga en cuenta que, a pesar de que todos los métodos implicados son virtuales, la anulación de C no afecta el método virtual en A debido a que el uso de new en B oculta la implementación A.

Editar: Se ha observado en los comentarios a esta respuesta que lo anterior puede ser peligroso o al menos no particularmente útil. Yo diría que sí, que puede ser peligroso y que estaría allí si fuera útil.

En particular, podría meterse en todo tipo de problemas si también cambia los modificadores de accesibilidad. Por ejemplo:-

public class Foo { internal Foo() { } protected virtual string Thing() { return "foo"; } } public class Bar : Foo { internal new string Thing() { return "bar"; } }

Para un heredero externo de Bar , la implementación de Tho () por parte de Foo sigue siendo accesible e invalidable. Todo legal y explicable de acuerdo con las reglas de tipo .NET nunca es del todo intuitivo.

He publicado esta respuesta para profundizar en la comprensión de cómo funcionan las cosas, no como una sugerencia de técnicas que se pueden usar libremente.


Shadowing es un concepto de VB.NET. En C #, Shadowing se conoce como Ocultar. Oculta el método de clase derivado. Se logra usando la palabra clave ''nueva''.

La palabra clave Override se usa para proporcionar una implementación completamente nueva de un método de clase base (que está marcado como ''Virtual'') en la clase derivada.