2011-12-20 23 views

Respuesta

5

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:

DerivedInstance hide method

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.

+1

Aquí está [una respuesta relacionada de otro hilo] (https://stackoverflow.com/a/4760614/1336654). –

+1

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. –

+0

Debe haber una insignia especial para dar con la respuesta correcta seis años después de que se publicó la pregunta –

13

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.

+1

Gracias, busqué en Google y obtuve resultados que dicen que son diferentes, sin ninguna explicación. Ahora puedo vincularlos a esta página :-P –

+3

@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. –

0

Son lo mismo, es solo la palabra clave específica del idioma para implementar el mismo concepto de OOP.

Cuestiones relacionadas