阴影(VB.NET)和新(C#)之间的区别

时间:2011-12-20 12:24:54

标签: c# .net vb.net new-operator shadows

简单易懂的简单问题: VB.NET中的Shadows关键字和C#中的New关键字有什么区别? (关于课程签名当然)。

3 个答案:

答案 0 :(得分:13)

它们完全相同。 Shadows是C#的new keyword的VB.NET等价物。它们在语义上意味着相同的东西,并且它们编译成相同的IL。

在某些版本的Visual Studio中(我不确定是否仍然如此),在VB.NET项目中使用Shadows关键字可以隐藏Intellisense中具有相同名称的所有函数。但这实际上并不是一种语言特征;它甚至不清楚是设计还是实施Intellisense的错误。如果您使用C#应用程序中的相同VB.NET库,您将看到所有方法,就好像它们是使用new声明的那样。

答案 1 :(得分:6)

他们相同。

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 shadows method

要在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

编译后会发生这种情况:

DerivedInstance hide method

所以,在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
}

所以....他们相同。

注意:在downvote之前......请....试试。

答案 2 :(得分:0)

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