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

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

它们完全相同。

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 } 

所以….他们并不完全相同。

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

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

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

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