Разница между тенями (VB.NET) и новыми (C #) - PullRequest
10 голосов
/ 20 декабря 2011

Простой вопрос от простого человека: В чем разница между ключевым словом Shadows в VB.NET и ключевым словом New в C #? (конечно, в отношении сигнатур методов).

Ответы [ 3 ]

13 голосов
/ 20 декабря 2011

Они идентичны. Shadows является эквивалентом VB.NET для ключевого слова C # new . Они означают одно и то же семантически и компилируются в один и тот же IL.

В некоторых версиях Visual Studio (я не уверен, что это все еще так), использование ключевого слова Shadows в проекте VB.NET приводило к скрытию всех функций с одинаковым именем от Intellisense. Но на самом деле это не языковая особенность; даже неясно, является ли это разработкой или ошибкой в ​​реализации Intellisense. Если вы используете ту же библиотеку VB.NET из приложения C #, вы увидите все методы, как если бы они были объявлены с помощью new.

7 голосов
/ 16 октября 2017

Они не идентичны.

Концепция Shadowing не существует в C #

Рассмотрим базовый класс 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 имеет только одну версию SomeMethod, а все другие базовые версии были затенены .

если вы скомпилируете сборку и сделаете ссылку на нее в проекте C #, вы увидите, что произойдет:

Метод теней DerivedInstance

Чтобы выполнить сокрытие в VB.Net, вам все равно придется использовать перегрузки (или переопределения , если базовый метод помечен как перезаписываемым ) ключевое слово:

Public Class DerivedClass
    Inherits BaseClass

    Public Overloads Function SomeMethod(SomeParam As String) As String
        Return "Derived from String"
    End Function
End Class

И вот что происходит после компиляции:

Метод скрытия DerivedInstance

Итак, если вы используете ключевое слово overloads в VB.Net для сигнатуры, совпадающей с сигнатурой в базовом классе, вы скрываете эту базовую версию метода, как Вы бы в C #:

public class DerivedClass : BaseClass
{
    public new string SomeMethod(string someParam)
    {
        return "Derived from String";
    }
}

Редактировать: Это код IL:

Из 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
}

От 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
}

Итак ... они не идентичны.

Примечание: перед понижением ... пожалуйста .... просто попробуйте.

0 голосов
/ 20 декабря 2011

Они одинаковые, это просто ключевое слово для конкретного языка для реализации той же концепции ООП.

...