2011-12-20 31 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概念。

相關問題