Pregunta simple de una simple mentalidad: ¿Cuáles son las diferencias entre la palabra clave Shadows
en VB.NET y la palabra clave New
en C#? (con respecto a las firmas de métodos, por supuesto).Diferencia entre sombras (VB.NET) y nuevo (C#)
Respuesta
Son no idénticos.
El remedo concepto no existe en C#
Considérese una clase base vb.net con algunas sobrecargas:
Public Class BaseClass
Public Function SomeMethod() As String
Return String.Empty
End Function
Public Function SomeMethod(SomeParam As String) As String
Return "Base from String"
End Function
Public Function SomeMethod(SomeParam As Integer) As String
Return "Base from Integer"
End Function
Public Function SomeMethod(SomeParamB As Boolean) As String
Return "Base from Boolean"
End Function
End Class
Y esta clase derivada:
Public Class DerivedClass
Inherits BaseClass
Public Shadows Function SomeMethod(SomeParam As String) As String
Return "Derived from String"
End Function
End Class
Ahora considere la implementación:
Dim DerivedInstance = New DerivedClass()
DerivedInstance tienen solo uno versión de SomeMethod y todas las demás versiones base han sido ensombrecida .
si compila y hacer referencia al ensamblado en un proyecto de C# se puede ver lo que sucede:
DerivedInstance shadows method
Para realizar escondido en VB.Net, usted todavía tiene que utilizar las sobrecargas (o anulaciones si el método de base se marca como reemplazable) palabra clave:
Public Class DerivedClass
Inherits BaseClass
Public Overloads Function SomeMethod(SomeParam As String) As String
Return "Derived from String"
End Function
End Class
Y esto es lo que sucede después de compilar:
Así, en VB.Neta, si se utiliza sobrecargas de palabras clave, en una firma que coincida con uno de clase base, que está ocultando que la versión base del método, al igual que lo haría en C#:
public class DerivedClass : BaseClass
{
public new string SomeMethod(string someParam)
{
return "Derived from String";
}
}
Editar: Este es el código de IL:
De C#:
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
IL_0000: ldarg.0
IL_0001: call instance void Shadowing_CS.BaseClass::.ctor()
IL_0006: ret
}
.method public hidebysig instance string SomeMethod (
string s
) cil managed
{
IL_0000: ldstr "Derived from string"
IL_0005: ret
}
De VB:
.method public specialname rtspecialname instance void .ctor() cil managed
{
IL_0000: ldarg.0
IL_0001: call instance void Shadowing_VB.BaseClass::.ctor()
IL_0006: ret
}
.method public instance string SomeMethod (
string s
) cil managed
{
IL_0000: ldstr "Derived from string"
IL_0005: ret
}
Así que .... que son no idénticos.
Nota: Antes de votar ... por favor ... solo inténtelo.
Son idénticos.Shadows
es el equivalente de VB.NET para C# 's new
keyword. Significan lo mismo semánticamente y compilan hasta la misma IL.
En algunas versiones de Visual Studio (no estoy seguro de si este es todavía el caso), el uso de la palabra clave Shadows
en un proyecto de VB.NET tuvo el efecto de ocultar todas las funciones con el mismo nombre de Intellisense. Pero eso no es realmente una función de idioma; Ni siquiera está claro si es por diseño o un error en la implementación de Intellisense. Si usa la misma biblioteca VB.NET desde una aplicación C#, verá todos los métodos como si hubieran sido declarados con new
.
Gracias, busqué en Google y obtuve resultados que dicen que son diferentes, sin ninguna explicación. Ahora puedo vincularlos a esta página :-P –
@MAHanin Como otra respuesta y los hilos enlazados explican, en VB.NET, 'Función de sombras públicas SomeMethod (SomeParam As String) As String', con' Shadows', ocultará todo las firmas de 'SomeMethod', no solo esta en particular. Mientras que la función 'Sobrecargas Públicas SomeMethod (SomeParam As String) As String', con' Overloads', solo oculta esta firma en particular. En C#, no hay forma de ocultar todas las firmas; cada 'nuevo' solo oculta una firma. –
Son lo mismo, es solo la palabra clave específica del idioma para implementar el mismo concepto de OOP.
- 1. Diferencia entre ASP.Net, C# .Net y VB.Net?
- 2. Sombras vs sobrecargas en VB.NET
- 3. Diferencia entre DirectCast() y CType() en VB.NET
- 4. Diferencia entre XMLReader.Create() y nuevo XMLTextReader()
- 5. diferencia entre el nuevo y anular
- 6. Diferencia entre C: y C:/
- 7. Diferencia entre sucesos de cableado con y sin "nuevo"
- 8. punteros void: diferencia entre C y C++
- 9. La diferencia entre + y & para unir cadenas en VB.NET
- 10. C# diferencia entre == y equals()
- 11. Silverlight: ¿existe una diferencia de rendimiento entre los gestores de eventos de C# y VB.net?
- 12. Diferencia entre C++ administrado y C++
- 13. Diferencia entre Dim y Privado
- 14. ¿Diferencia entre == y caso?
- 15. ¿Cuál es la diferencia entre el nuevo operador y Class.newInstance()?
- 16. ¿cuál es la diferencia entre crear y nuevo?
- 17. Diferencia entre el tiempo() y el nuevo MongoDate()?
- 18. ¿Hay alguna diferencia entre SqlConnection.CreateCommand y el nuevo SqlCommand?
- 19. Cuál es la diferencia entre el nuevo char [10] y el nuevo char (10)
- 20. ¿Cuál es la diferencia entre Managed C++ y C++/CLI?
- 21. Diferencia entre las clases parciales C# y Objective C?
- 22. ¿Diferencia entre sombreado y anulación en C#?
- 23. Diferencia entre byte y char en C
- 24. Diferencia entre read() y fgets() en C
- 25. objetivo c diferencia entre funciones y métodos
- 26. C++ diferencia entre 0 y 0.0
- 27. diferencia entre + y - métodos en Objective-C
- 28. Diferencia entre Convert.ToString() y .ToString() en C#?
- 29. Diferencia entre char * y char [] en C
- 30. C#: diferencia entre "System.Object" y "objeto"
Aquí está [una respuesta relacionada de otro hilo] (https://stackoverflow.com/a/4760614/1336654). –
Esta respuesta es correcta. Cuando la clase base tiene dos firmas para un nombre de método, y la clase que hereda menciona solo una de estas firmas, la palabra clave C# 'new' corresponde a la construcción de VB.NET' Función de sobrecarga pública SomeMethod (SomeParam As String) As String' , no a 'Función pública de sombras SomeMethod (SomeParam As String) As String'. En C#, no hay forma de que ___hide___ la otra firma también (excepto si repites ambas firmas en la clase que hereda, por supuesto). C# siempre pone 'hidebysig' en la salida CIL. En VB.NET, puede esconderse solo por su nombre. –
Debe haber una insignia especial para dar con la respuesta correcta seis años después de que se publicó la pregunta –