Простой вопрос от простого человека:
Каковы различия между ключевым словом Shadows
в VB.NET и ключевым словом New
в С#? (в отношении сигнатур метода, конечно).
Разница между тенями (VB.NET) и New (С#)
Ответ 1
Они не идентичны.
Концепция Shadowing не существует в С#
Рассмотрим базовый класс vb.net с некоторыми перегрузками:
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
И этот производный класс:
Public Class DerivedClass
Inherits BaseClass
Public Shadows Function SomeMethod(SomeParam As String) As String
Return "Derived from String"
End Function
End Class
Теперь рассмотрим реализацию:
Dim DerivedInstance = New DerivedClass()
DerivedInstance имеет только версию one версии SomeMethod и все другие базовые версии были затенены.
если вы компилируете и ссылаетесь на сборку в проекте С#, вы можете видеть, что происходит:
Чтобы выполнить скрытие в VB.Net, вам все равно придется использовать перегрузки (или переопределяет, если базовый метод отмечен как overridable) ключевое слово:
Public Class DerivedClass
Inherits BaseClass
Public Overloads Function SomeMethod(SomeParam As String) As String
Return "Derived from String"
End Function
End Class
И вот что происходит после компиляции:
Итак, в VB.Net, если вы используете ключевое слово перегрузки, в подписи, которая соответствует одной в базовом классе, вы скрываете эту базовую версию метода, как и в С#:
public class DerivedClass : BaseClass
{
public new string SomeMethod(string someParam)
{
return "Derived from String";
}
}
Изменить: это код IL:
Из С#:
.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
}
От 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
}
Итак, они не идентичны.
Примечание: Перед тем, как делать downvote... пожалуйста.... просто попробуйте.
Ответ 2
Они идентичны. Shadows
- эквивалент VB.NET для С# new
ключевое слово. Они означают одно и то же семантически, и они сводятся к одному и тому же ИЛ.
В некоторых версиях Visual Studio (я не уверен, что это все еще так), использование ключевого слова Shadows
в проекте VB.NET имело эффект сокрытия всех функций с тем же именем из Intellisense. Но это не на самом деле функция языка; это даже не ясно, если это по дизайну или ошибка в реализации Intellisense. Если вы используете одну и ту же библиотеку VB.NET из приложения С#, вы увидите все методы, как если бы они были объявлены с помощью new
.
Ответ 3
Они одинаковы, это просто ключевое слово для реализации одной и той же концепции ООП.