2009-01-12 46 views
17

Tôi có một mô-đun Tiện ích từ VB.NET không có lớp tĩnh như C# và Mô-đun là lớp tĩnh trong VB.NET. Lý do tôi sử dụng mô-đun là bởi vì tôi đang sử dụng phương pháp Extension và nó chỉ có thể được sử dụng trong Module.VB.NET: Làm thế nào để tham khảo mô-đun VB.NET?

Tôi không thể tham chiếu đến mô-đun này nhưng nếu tôi đặt mã của mình trong một lớp học. Tôi có thể tham khảo nó mà không có bất kỳ vấn đề gì. Điều gì có thể là lý do? Tôi đã bỏ lỡ C#.

Chỉnh sửa: Mô-đun nằm bên trong một thư viện lớp, gọi Tiện ích.

+0

Hãy suy nghĩ bạn hiểu lầm về khả năng của VB.Net. Mô-đun không phải là Lớp chia sẻ/tĩnh, chúng là toàn cầu đối với các phương thức Không gian tên có thể được sử dụng ở bất kỳ đâu. Chúng thường là Loại trừu tượng, không phải là Tiện ích mở rộng. Chức năng, Subs, và thậm chí phần mở rộng tất cả sống ra khỏi bong bóng OOP, được mô tả bởi @ Konrad-Rudolph – GoldBishop

+0

Một điểm khác, cho người xem trong tương lai .... Tên của các mô-đun không được có cùng tên giữa các thư viện. Tên phải là duy nhất trong tên giữa các sử dụng. – GoldBishop

Trả lời

9

Tôi không thể tham chiếu đến mô-đun này nhưng nếu tôi đặt mã của tôi trong một lớp học. Tôi có thể tham khảo nó mà không có bất kỳ vấn đề gì. Có ai biết tại sao không?

Do mô-đun trong VB không phải là lớp và không thể được sử dụng để tạo nhanh đối tượng. Thay vào đó, chúng là một cái gì đó tương tự như không gian tên, với sự khác biệt mà không gian tên không thể chứa các hàm trực tiếp. Vì vậy, lý do cho các mô-đun là cung cấp một cách để nhóm các hàm một cách logic mà không thuộc về một lớp.

Điều này rất có ý nghĩa khi bạn xem xét rằng không phải mọi thứ đều thuộc về một lớp logic. Xem xét System.Math. Hoàn toàn không có lý do gì để làm cho một lớp học, ngoài một chủ nghĩa thuần túy OOP kỳ lạ.

Nhân tiện, bạn không thể tham chiếu các lớp tĩnh trong C# hoặc, ít nhất là nếu tôi hiểu chính xác ý bạn là gì bằng cách "tham chiếu". Có lẽ bạn có thể làm rõ điều này.

+0

Tôi đã luôn luôn nghĩ rằng, nhưng sau đó có gì sai với việc đặt sau đó trong một lớp "Chia sẻ"? Nếu một hàm nhận dữ liệu, thực hiện phép tính và rút ra kết quả, không sử dụng hoặc sửa đổi bất kỳ thứ gì khác ngoài dữ liệu đầu vào, tại sao nó không thể ở trong một lớp và được đánh dấu là "Được chia sẻ"? – SqlRyan

+1

Câu hỏi đặt ra là: tại sao phải không? Lớp học có lợi thế gì? OOP như một mô hình chỉ hữu ích nếu nó có lợi thế. Các lớp không có dữ liệu (và không có vị trí như một loại điểm đánh dấu) không phục vụ bất kỳ mục đích nào. –

+0

@SqlRyan tại sao một "chung" thậm chí còn cư trú với bong bóng của một lớp học? Tại sao không cư trú trong không gian tên? hoặc tốt hơn, chỉ trong chính Thư viện. Nếu nó không liên quan đến Lớp hoặc Không gian tên, tại sao nó phải được gắn với một? Các mô-đun là một cách tạo phạm vi của Thư viện để tạo các Phương thức mà không kết hôn chúng với một đối tượng không mô tả đúng cách sử dụng của nó. – GoldBishop

1

Có thể các phương thức/đăng ký không công khai? Tôi đã có vấn đề đó một lần, và nó sẽ cho phép truy cập mã địa phương trong lớp học của bạn, nhưng không phải nếu nó đã được bên ngoài lớp học của bạn và đánh dấu "tư nhân".

0

Tôi không hiểu bạn đang hỏi gì.

VB.NET không có các lớp học tĩnh, giống như trong C#, bởi vì trong VB.NET một Module một static class. Họ là một và giống nhau. Bất cứ điều gì bạn có thể làm với một lớp tĩnh bạn có thể làm với một Module. Có lẽ bạn chưa đánh dấu chính xác quyền truy cập Công khai/Riêng tư/Được bảo vệ của mình?

+4

@ Joel: không, chúng không giống nhau ở cấp độ ngôn ngữ. Đặc biệt, các mô-đun ngầm nhập tên của chúng vào không gian tên hiện tại. Điều này có nghĩa là bạn không cần phải tiền tố tên của mô-đun với tên mô-đun khi đề cập đến chúng (miễn là không gian tên xung quanh của mô-đun được nhập). –

+0

@ Jelel: Thông tin của bạn không chính xác .... 'Module' __IS NOT__ là' lớp tĩnh ' – GoldBishop

0
Imports System.Web 
Imports System.Web.UI 

Module ResponseHelper 

    <System.Runtime.CompilerServices.Extension()> _ 
    Public Sub Redirect(ByVal response As Net.HttpWebResponse, _ 
         ByVal url As String, ByVal target As String, _ 
         ByVal windowFeatures As String) 

     If String.IsNullOrEmpty(target) Or _ 
      target.Equals("_self", StringComparison.OrdinalIgnoreCase) And _ 
      String.IsNullOrEmpty(windowFeatures) Then 
      response.Redirect(url, target, windowFeatures) 
     Else 
      Dim page As Page = CType(HttpContext.Current.Handler, Page) 
      If page Is Nothing Then 
       Throw New InvalidOperationException("Cannot redirect to new window outside Page context.") 
      End If 
      url = page.ResolveClientUrl(url) 
      Dim script As String 
      If String.IsNullOrEmpty(windowFeatures) Then 
       script = "window.open(""{0}"", ""{1}"", ""{2}"";" 
      Else 
       script = "window.open(""{0}"", ""{1}"");" 
      End If 
      script = String.Format(script, url, target, windowFeatures) 
      ScriptManager.RegisterStartupScript(page, GetType(Page), "Redirect", script, True) 

     End If 
    End Sub 

End Module 
+0

là bạn đang cố gắng ghi đè response.redirect bằng hàm javascript>. < – Shawn

42

Bạn cần đánh dấu mô-đun là Mô-đun công khai.

6

Trình biên dịch .NET có thể lấy bất kỳ loại cú pháp ngôn ngữ nào và biến thành một tương đương .NET. Đôi khi có một cho một thư từ khác lần khác không có.

Bằng cách sử dụng .NET Reflector bạn có thể xem trình biên dịch thực sự đang làm gì.

Trong mô hình VB.NET mô-đun tồn tại do di sản được kế thừa từ Visual BASIC và một phần từ Microsoft BASIC.

VB.NET trình biên dịch sẽ thực hiện việc này

Public Module CoreModule 
    Dim R As New System.Random(CInt(Microsoft.VisualBasic.Timer)) 
    Public Function D(ByVal Roll As Integer) As Integer 
     Return R.Next(0, Roll) + 1 
    End Function 

    Public Function _1D6() As Integer 
     Return D(6) 
    End Function 

    Public Function _2D6() As Integer 
     Return D(6) + D(6) 
    End Function 

    Public Function _3D6() As Integer 
     Return D(6) + D(6) + D(6) 
    End Function 

    Public Function _4D6() As Integer 
     Return D(6) + D(6) + D(6) + D(6) 
    End Function 

    Public Function CRLF() As String 
     Return Microsoft.VisualBasic.ControlChars.CrLf 
    End Function 
End Module 

Và biến nó thành này (mã bỏ qua cho ngắn gọn)

Public NotInheritable Class CoreModule 
    ' Methods 
    Shared Sub New() 
    Public Shared Function _1D6() As Integer 
    Public Shared Function _2D6() As Integer 
    Public Shared Function _3D6() As Integer 
    Public Shared Function _4D6() As Integer 
    Public Shared Function CRLF() As String 
    Public Shared Function D(ByVal Roll As Integer) As Integer 

    ' Fields 
    Private Shared R As Random 
End Class 

Trong C# tương đương là này

public sealed class CoreModule 
{ 
    // Fields 
    private static Random R; 

    // Methods 
    static CoreModule(); 
    public static int _1D6(); 
    public static int _2D6(); 
    public static int _3D6(); 
    public static int _4D6(); 
    public static string CRLF(); 
    public static int D(int Roll); 
} 

Tất cả các vấn đề đó là phát ra CIL thực hiện công việc một cách chính xác.

Khả năng này là lý do chính tại sao nhiều lập trình viên Visual BASIC 6 cũ hơn rất bực mình với những thay đổi của MS đối với ngôn ngữ. Ví dụ: từ khóa Integer phát ra Int32 thay vì Int16.

Mô-đun được hiển thị với các hội đồng khác tham chiếu đến cụm ban đầu miễn là mô-đun được công bố công khai.

+0

Làm rõ, BasicA chưa bao giờ được sở hữu bởi Microsoft .. ..Microsoft bắt đầu sở hữu QBasic. [Cơ bản] (https://en.wikipedia.org/wiki/BASIC) – GoldBishop

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