2011-12-20 87 views

Trả lời

5

Chúng là không phải giống hệt nhau.

Các Shadowing khái niệm không tồn tại trong C#

Hãy xem xét một lớp cơ sở vb.net với một số quá tải:

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 

Và lớp được thừa kế này:

Public Class DerivedClass 
    Inherits BaseClass 

    Public Shadows Function SomeMethod(SomeParam As String) As String 
     Return "Derived from String" 
    End Function 
End Class 

Bây giờ xem xét việc triển khai:

Dim DerivedInstance = New DerivedClass() 

DerivedInstance có chỉ một phiên bản của SomeMethod và tất cả phiên bản cơ sở khác đã được shadowed.

nếu bạn biên dịch và tham khảo lắp ráp trong một dự án C# bạn có thể xem những gì sẽ xảy ra:

DerivedInstance shadows method

Thực hiện ẩn trong VB.Net, bạn vẫn phải sử dụng quá tải (hoặc ghi đè nếu phương pháp cơ bản được đánh dấu là overridable) từ khóa:

Public Class DerivedClass 
    Inherits BaseClass 

    Public Overloads Function SomeMethod(SomeParam As String) As String 
     Return "Derived from String" 
    End Function 
End Class 

Và đây là những gì xảy ra sau khi biên dịch:

DerivedInstance hide method

Vì vậy, trong VB.Net, nếu bạn sử dụng quá tải từ khóa, trên chữ ký phù hợp với một lớp cơ sở trên, bạn đang ẩn rằng phiên bản cơ sở của phương pháp, giống như bạn sẽ trong C#:

public class DerivedClass : BaseClass 
{ 
    public new string SomeMethod(string someParam) 
    { 
     return "Derived from String"; 
    } 
} 

Chỉnh sửa: Đây là mã IL:

Từ 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 
} 

Từ 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 
} 

Vì vậy .... chúng là không phải giống hệt nhau.

Lưu ý: Trước khi downvote ... xin vui lòng .... chỉ cần thử.

+1

Đây là [câu trả lời có liên quan từ một chủ đề khác] (https://stackoverflow.com/a/4760614/1336654). –

+1

Câu trả lời này là chính xác. Khi lớp cơ sở có hai chữ ký cho một tên phương thức, và lớp kế thừa chỉ đề cập đến một trong các chữ ký này, thì từ khóa C# 'mới' tương ứng với cấu trúc VB.NET' Hàm dư thừa công cộng SomeMethod (SomeParam As String) như String' , không phải cho 'Chức năng Shadows công cộng SomeMethod (SomeParam như String) như String'. Trong C#, không có cách nào để ___hide___ chữ ký khác nữa (trừ khi bạn lặp lại cả chữ ký trong lớp kế thừa, tất nhiên). C# luôn đặt 'hidebysig' trong CIL đầu ra. Trong VB.NET, bạn có thể ẩn theo tên một mình. –

+0

Nên có một huy hiệu đặc biệt để đưa ra câu trả lời đúng 6 năm sau khi câu hỏi được đăng –

13

Chúng giống hệt nhau.Shadows là VB.NET tương đương với số new keyword của C#. Họ có nghĩa là cùng một điều ngữ nghĩa và họ biên dịch xuống cùng một IL.

Trong một số phiên bản của Visual Studio (tôi không chắc đây có phải là trường hợp không), sử dụng từ khóa Shadows trong dự án VB.NET có tác dụng ẩn tất cả các hàm có cùng tên từ Intellisense. Nhưng đó không thực sự là một tính năng ngôn ngữ; nó thậm chí không rõ ràng nếu nó là do thiết kế hoặc một lỗi trong việc thực hiện Intellisense. Nếu bạn sử dụng cùng một thư viện VB.NET từ một ứng dụng C#, bạn sẽ thấy tất cả các phương thức như thể chúng được khai báo với new.

+1

Cảm ơn bạn, Tôi đã Googled và nhận được kết quả cho biết chúng khác nhau, không có bất kỳ lời giải thích nào. Bây giờ tôi có thể liên kết chúng trang này :-P –

+3

@MAHanin Như một câu trả lời khác và các chủ đề liên kết giải thích, trong VB.NET, 'Chức năng Shadows công cộng SomeMethod (SomeParam As String) Như String', với' Shadows', sẽ ẩn tất cả chữ ký của 'SomeMethod', không chỉ chữ ký này. Trong khi đó, 'Hàm thừa tải công cộng SomeMethod (SomeParam As String) Như String', với' Overloads', chỉ ẩn dấu hiệu đặc biệt này. Trong C#, không có cách nào để ẩn tất cả các chữ ký; mỗi 'new' chỉ ẩn một chữ ký. –

0

Chúng giống nhau, chỉ là từ khóa cụ thể về ngôn ngữ để thực hiện cùng khái niệm OOP.

Các vấn đề liên quan