12

一个简单的问题:ShadowsVB.NET中的New关键字和C#中的关键字有什么区别?(当然关于方法签名)。

4

2 回答 2

11

它们相同。

C#中不存在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 只有一个版本的 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 隐藏方法

因此,在 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
}

所以....它们并不相同。

注意:在投反对票之前......请......试试吧。

于 2017-10-16T14:50:52.273 回答
0

它们是相同的,只是实现相同 OOP 概念的语言特定关键字。

于 2011-12-20T12:29:17.357 回答