简单的问题: VB.NET中的Shadows
关键字与C#中的New
关键字有什么区别? (当然关于方法签名)。阴影(VB.NET)与新建(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刚一个版本的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
这是编译后会发生什么:
所以,在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 ...请....只是尝试。
它们是相同的。Shadows
是C#的new
keyword的VB.NET等价物。它们在语义上意味着相同的事物,并且它们汇编成相同的IL。
在某些版本的Visual Studio中(我不确定这是否仍然如此),在VB.NET项目中使用Shadows
关键字会隐藏Intellisense中所有具有相同名称的函数。但这实际上并不是一种语言功能;它甚至不清楚是通过设计还是实施Intellisense中的错误。如果您从C#应用程序使用相同的VB.NET库,您将看到所有的方法,就好像它们是用new
声明的一样。
谢谢,我谷歌搜索结果说他们是不同的,没有任何解释。现在我可以链接他们这个页面:-P – 2011-12-20 12:52:30
@MAHanin作为其他答案和链接线程解释,在VB.NET中,公共阴影函数SomeMethod(SomeParam作为字符串)作为字符串,与'阴影',将隐藏所有“SomeMethod”的签名,而不仅仅是这个特定的签名。而'Public Overloads Function SomeMethod(SomeParam As String)As String','Overloads',只隐藏这个特定的签名。在C#中,无法隐藏所有签名;每个“新”只隐藏一个签名。 – 2017-10-18 09:10:27
它们是相同的,它只是语言特定的关键字来实现相同的OOP概念。
- 1. C#中阴影和重写之间的区别?
- 2. 新建与覆盖之间的区别?
- 3. ASP.Net,C#.Net和VB.Net之间的区别?
- 4. Polymer的阴影DOM与阴影DOM有什么区别?
- 5. VB.Net和C#之间的区别“作为新的WebControl”
- 6. 在VB.NET和C之间创建实例的区别#
- 7. Ember:unloadRecord与新记录之间的区别
- 8. VB.NET中的阴影与过载
- 9. iOS - 设置UIView阴影时的偏移和插入之间的区别?
- 10. C#部分类与Objective C类别之间的区别?
- 11. C#和VB.NET控制台会话之间的区别
- 12. C#和VB.Net自定义类之间的区别
- 13. 使用D3的两条线之间的阴影区域
- 14. 在阴影方面,for each和traditional for for循环之间有什么区别?
- 15. 阴影geom_line和x轴之间的区域
- 16. 绘图中曲线之间的阴影区域
- 17. 绘制两条曲线之间的阴影区域
- 18. 两条曲线之间的阴影区域
- 19. 时间()与stime()之间的区别
- 20. C#“var”和C++“auto”之间的区别
- 21. 如何在两条线之间绘制阴影区域
- 22. C++中新int()和新int {}之间的区别
- 23. XMLReader.Create()和新的XMLTextReader()之间的区别
- 24. Cython之间的区别,扩展C/C++与Python.h等
- 25. C中的/ +和+之间的区别?
- 26. r - ggplot2 - 在两个geom_abline图层之间创建一个阴影区域
- 27. 布局之间添加阴影
- 28. Matplotlib:两幅图像之间的阴谋区别
- 29. 和之间的区别。在Objective-C
- 30. Java和C#和.NET之间的区别
这是[另一个线程的相关答案](https://stackoverflow.com/a/4760614/1336654)。 – 2017-10-18 08:36:17
这个答案是正确的。当基类有一个方法名的两个签名,并且继承类只提到这些签名中的一个时,那么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
在问题发布六年后,应该有一个特殊的徽章来提出正确的答案 – 2017-10-20 11:09:41