簡單的問題: 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. 更新與NULL和''之間的區別?
- 9. 行建模與EAV之間的區別
- 10. VB6.0,VB2010,VB.NET之間的區別
- 11. vbHidden和Windows.Visibility.Hidden之間的區別WPF vb.net
- 12. VB.NET中的陰影與過載
- 13. 「或」與「||」之間的區別?
- 14. ~~與Math.floor之間的區別()
- 15. iOS - 設置UIView陰影時的偏移和插入之間的區別?
- 16. C#部分類與Objective C類別之間的區別?
- 17. 存根,mockito「模擬」類和Robolectric「陰影」對象之間的區別
- 18. LumMod/lumOff和DrawingML顏色中的色調/陰影之間有什麼區別?
- 19. C#和VB.NET控制檯會話之間的區別
- 20. C#和VB.Net自定義類之間的區別
- 21. PAM與Metis分區之間的區別
- 22. 與別名之間的區別
- 23. 使用D3的兩條線之間的陰影區域
- 24. 在陰影方面,for each和traditional for for循環之間有什麼區別?
- 25. 繪圖中曲線之間的陰影區域
- 26. 陰影geom_line和x軸之間的區域
- 27. 繪製兩條曲線之間的陰影區域
- 28. 兩條曲線之間的陰影區域
- 29. 兩條符號曲線之間的陰影區域matlab
- 30. C#「var」和C++「auto」之間的區別
這是[另一個線程的相關答案](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