Câu hỏi đơn giản từ đầu óc đơn giản: Sự khác biệt giữa từ khóa Shadows
trong VB.NET và từ khóa New
trong C# là gì? (liên quan đến chữ ký của phương thức).Sự khác nhau giữa Shadows (VB.NET) và New (C#)
Trả lời
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:
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ử.
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
.
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 –
@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ý. –
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.
- 1. C#: Sự khác nhau giữa '+ = anEvent' và '+ = new EventHandler (anEvent)'
- 2. Sự khác nhau giữa MyClass.prototype = new Object() và MyClass.prototype = Object
- 3. Sự khác nhau giữa C: và C:/
- 4. Shadows vs Overloads trong VB.NET
- 5. Sự khác nhau giữa đối tượng a = new Dog() vs Dog a = new Dog()
- 6. Sự khác nhau giữa "btn.Click + = new RoutedEventHandler (ButtonClick)" và "btn.Click + = ButtonClick" là gì?
- 7. Sự khác nhau giữa [Class new] và [[Class alloc] init trong iOS là gì?
- 8. Sự khác nhau giữa C# và visual C# là gì?
- 9. Sự khác biệt giữa 'File.Open()' và 'new FIleStream()'
- 10. Sự khác biệt giữa "new A()" và "A.newInstance()" là gì?
- 11. Trong Javascript, sự khác biệt giữa 'Object.create' và 'new'
- 12. Sự khác nhau giữa Java và C# và .NET
- 13. Sự khác nhau giữa dbcontext.Add và dbcontext.AddObject
- 14. Sự khác nhau giữa ElapsedTicks, ElapsedMilliseconds, Elapsed.Milliseconds và Elapsed.TotalMilliseconds? (C#)
- 15. Sự khác nhau giữa việc gọi Double.valueOf (String s) và new Double (String s) là gì?
- 16. Sự khác nhau giữa new itemproperty và set-itemproperty là gì?
- 17. Sự khác nhau giữa SpVoice và SpeechSynthesizer
- 18. Sự khác nhau giữa `% trong%` và `== '
- 19. Sự khác nhau giữa Date.parse() và .getTime()
- 20. Sự khác nhau giữa R.layout và android.R.layout
- 21. Sự khác nhau giữa System.DateTime.Now và System.DateTime.Today
- 22. Sự khác nhau giữa 'SpecialFolder.LocalApplicationData' và 'SpecialFolder.ApplicationData'?
- 23. Sự khác nhau giữa thuộc tính và hàm được tham số trong vb.net là gì?
- 24. Sự khác nhau giữa JAVA_HOME và JRE_HOME
- 25. Sự khác nhau giữa OTL và SOCI
- 26. Sự khác nhau giữa String.getBytes() và IOUtils.toByteArray()?
- 27. Sự khác nhau giữa Tkinter và Tkinter
- 28. Sự khác nhau giữa C#, .NET và CLI là gì?
- 29. Sự khác nhau giữa Ctrl-C và SIGINT là gì?
- 30. Sự khác nhau giữa Objective-C và Cocoa là gì?
Đây là [câu trả lời có liên quan từ một chủ đề khác] (https://stackoverflow.com/a/4760614/1336654). –
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. –
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 –