阴影(VB.NET)和New (c#)的区别
本文关键字:区别 New NET 阴影 VB | 更新日期: 2023-09-27 18:18:36
一个简单的问题:Shadows
关键字在VB中的区别是什么?. NET和c#中的New
关键字?(当然是关于方法签名的)
它们不相同
阴影的概念在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概念。