2011-12-20 80 views

回答

5

他们是不是相同。

如影随形概念并不在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 shadows method

要执行在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 hide method

所以,在VB。网络,如果使用重载关键字,在匹配的基类一个签名,你隐藏方法是基本版本,就像你会在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 ...请....只是尝试。

+1

这是[另一个线程的相关答案](https://stackoverflow.com/a/4760614/1336654)。 – 2017-10-18 08:36:17

+1

这个答案是正确的。当基类有一个方法名的两个签名,并且继承类只提到这些签名中的一个时,那么C#关键字'new'对应于VB.NET结构'Public Overloads Function SomeMethod(SomeParam As String)As String' ,而不是'Public Shadows Function SomeMethod(SomeParam As String)As String'。在C#中,也没有办法去隐藏另一个签名(当然,除非在继承类中重复签名)。 C#总是将'hidebysig'放在输出CIL中。在VB.NET中,你可以通过名字来隐藏。 – 2017-10-18 09:01:41

+0

在问题发布六年后,应该有一个特殊的徽章来提出正确的答案 – 2017-10-20 11:09:41

13

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

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

+1

谢谢,我谷歌搜索结果说他们是不同的,没有任何解释。现在我可以链接他们这个页面:-P – 2011-12-20 12:52:30

+3

@MAHanin作为其他答案和链接线程解释,在VB.NET中,公共阴影函数SomeMethod(SomeParam作为字符串)作为字符串,与'阴影',将隐藏所有“SomeMethod”的签名,而不仅仅是这个特定的签名。而'Public Overloads Function SomeMethod(SomeParam As String)As String','Overloads',只隐藏这个特定的签名。在C#中,无法隐藏所有签名;每个“新”只隐藏一个签名。 – 2017-10-18 09:10:27

0

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