阴影(VB.NET)和New (c#)的区别

本文关键字:区别 New NET 阴影 VB | 更新日期: 2023-09-27 18:18:36

一个简单的问题:Shadows关键字在VB中的区别是什么?. NET和c#中的New关键字?(当然是关于方法签名的)

阴影(VB.NET)和New (c#)的区别

它们不相同

阴影的概念在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只有一个版本的someemethod,而所有其他基本版本都被遮蔽

如果你在c#项目中编译和引用程序集,你可以看到发生了什么:

DerivedInstance阴影方法

在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中,如果你在一个与基类匹配的签名上使用重载关键字,你就是在隐藏方法的基版本,就像你在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
}

所以…

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