2009-01-12 15 views
17

Ich habe ein Dienstprogramm Modul seit VB.NET hat keine statische Klasse wie C# und Modul ist die statische Klasse in VB.NET. Der Grund, warum ich das Modul verwende, ist, weil ich die Erweiterungsmethode verwende und sie nur in Modul verwendet werden kann.VB.NET: Wie Referenz VB.NET-Modul?

Ich kann nicht auf dieses Modul verweisen, aber wenn ich meinen Code in eine Klasse legen. Ich kann mich ohne Probleme darauf beziehen. Was könnte der Grund sein? Ich habe C# verpasst.

Edit: Das Modul befindet sich in einem Klassenbibliothek Aufruf Dienstprogramm.

+0

Denken Sie, dass Sie die Fähigkeiten von VB.Net missverstehen. Module sind keine freigegebenen/statischen Klassen, sie sind global für die Namespace-Methoden, die überall verwendet werden können. Sie sind normalerweise Typ abstrakt, keine Erweiterungen. Funktionen, Subs und sogar Extensions leben alle aus der OOP-Blase, beschrieben von @ Konrad-Rudolph – GoldBishop

+0

Ein weiterer Punkt für zukünftige Betrachter .... Die Namen der Module dürfen nicht den gleichen Namen zwischen Bibliotheken haben. Die Namen müssen im Namen zwischen den Verwendungen eindeutig sein. – GoldBishop

Antwort

9

Ich kann nicht auf dieses Modul verweisen, aber wenn ich meinen Code in einer Klasse. Ich kann mich ohne Probleme darauf beziehen. Weiß jemand warum?

Da Module in VB keine Klassen sind und nicht zum Instanziieren von Objekten verwendet werden können. Sie ähneln Namespaces, mit dem Unterschied, dass Namespaces keine Funktionen direkt enthalten können. Der Grund für Module ist also, eine Möglichkeit zu bieten, Funktionen logisch zu gruppieren, die keiner Klasse angehören.

Dies ist sehr sinnvoll, wenn Sie bedenken, dass nicht alles logisch zu einer Klasse gehört. Betrachten Sie System.Math. Es gibt absolut keinen Grund, das zu einer Klasse zu machen, außer einem seltsamen OOP-Purismus.

Übrigens können Sie auch in C# keine statischen Klassen referenzieren, zumindest dann nicht, wenn ich richtig verstehe, was Sie unter "Referenz" verstehen. Vielleicht kannst du das klären.

+0

Ich habe das immer gedacht, aber was ist dann falsch mit der Platzierung in einer "Shared" Klasse? Wenn eine Funktion Daten aufnimmt, Berechnungen durchführt und Ergebnisse ausspuckt, ohne dass neben den Eingabedaten etwas anderes verwendet oder geändert wird, warum kann es dann nicht in einer Klasse sein und als "Shared" markiert sein? – SqlRyan

+1

Die Frage ist: warum sollte es? Welchen Vorteil hat die Klasse? OOP als Paradigma ist nur nützlich, wenn es einen Vorteil hat. Klassen ohne Daten (und ohne Platz als Marker-Typ) dienen keinem Zweck. –

+0

@SqlRyan Warum sollte ein "generisches" sogar mit der Blase einer Klasse wohnen? Warum nicht im Namespace residieren? oder noch besser, nur in der Bibliothek selbst. Wenn es keine Relevanz für die Klasse oder den Namespace hat, warum sollte es auf eins beschränkt sein? Module sind ein bibliotheksspezifischer Weg, Methoden zu erstellen, ohne sie streng an ein Objekt zu binden, das seine Verwendung nicht richtig beschreibt. – GoldBishop

1

Vielleicht sind die Methoden/Subs nicht öffentlich? Ich hatte dieses Problem einmal, und es würde den Zugriff auf lokalen Code in Ihrer Klasse erlauben, aber nicht, wenn es außerhalb Ihrer Klasse war und als "Privat" markiert war.

0

Ich verstehe nicht, was Sie fragen.

VB.NET tut statische Klassen haben, genau wie in C#, weil in VB.NET ein ModuleIS ein static class. Sie sind ein und dasselbe. Alles, was Sie mit einer statischen Klasse tun können, können Sie mit einem Modul machen. Vielleicht haben Sie Ihren öffentlichen/privaten/geschützten Zugang nicht korrekt markiert?

+4

@Joel: Nein, sie sind nicht auf einem Sprachniveau identisch. Insbesondere importieren Module implizit ihre Namen in den aktuellen Namensraum. Das bedeutet, dass Sie den Namen eines Moduls nicht mit dem Modulnamen voranstellen müssen, wenn Sie darauf verweisen (sofern der umgebende Namespace des Moduls importiert wird). –

+0

@Joel: Ihre Informationen sind nicht korrekt .... 'Module' __IS NOT__ eine' statische Klasse' – 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

versuchen Sie response.redirect mit einer JavaScript-Funktion zu überschreiben>. < – Shawn

42

Sie müssen das Modul als öffentliches Modul kennzeichnen.

6

.NET-Compiler können jede Art von Sprachsyntax verwenden und in ein .NET-Äquivalent umwandeln. Manchmal gibt es eine Eins-zu-eins-Korrespondenz, andere Zeiten gibt es nicht.

Mit der .NET Reflector können Sie sehen, was der Compiler wirklich macht.

In VB.NET existiert das Modul wegen des geerbten Erbes von Visual BASIC und teilweise von Microsoft BASIC.

Die VB.NET-Compiler wird diesen

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 

und es in diesem (Code der Kürze halber weggelassen)

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 

In C# entspricht dies

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); 
} 

, dass alle Materie, dass das ist emittiert CIL macht den Job richtig.

Diese Fähigkeit ist der Hauptgrund, warum so viele ältere Visual BASIC 6-Programmierer sehr verärgert über MS Änderungen an der Sprache sind. Zum Beispiel das Schlüsselwort Integer, das Int32 anstelle von Int16 ausgibt.

Module sind anderen Baugruppen ausgesetzt, die auf die ursprüngliche Baugruppe verweisen, solange das Modul für öffentlich erklärt wird.

+0

Klarstellung, BasicA war nie im Besitz von Microsoft. ..Microsoft hat den Besitz von QBasic übernommen. [Basic] (https://en.wikipedia.org/wiki/BASIC) – GoldBishop