Tengo un módulo de servicios desde VB.NET no tiene clase estática como C# y el Módulo es la clase estática en VB.NET. La razón por la que yo uso módulo es porque estoy utilizando el método de Extensión y sólo se puede utilizar en el Módulo.

Yo no puedo referencia a este módulo, pero si pongo mi código en una clase. Me puede hacer referencia a ella sin ningún problema. ¿Cuál podría ser la razón? Me perdí de C#.

Edit: El módulo está dentro de una clase llamada de la biblioteca de la Utilidad.

  • Creo que no se comprende acerca de VB.Net’s capacidades. Los módulos no son Compartidos/Clases Estáticas, que son globales para el espacio de Nombres de métodos que se pueden utilizar en cualquier lugar. Son generalmente de Tipo abstracto, ni Extensiones. Funciones, Subrutinas, e incluso Extensiones de vivir fuera de la programación orientada a objetos burbuja, descrito por @Konrad-Rudolph
  • Otro punto, para el futuro de los espectadores….Los nombres de los Módulos no deben tener el mismo nombre entre las Bibliotecas. Los nombres deben ser únicos en su nombre entre los usos.
InformationsquelleAutor Jack | 2009-01-12

6 Comentarios

  1. 9

    Yo no puedo referencia a este módulo, pero si pongo mi código en una clase. Me puede hacer referencia a ella sin ningún problema. ¿Alguien sabe por qué?

    Debido a que los Módulos en VB no son las clases y no puede ser utilizado para crear instancias de objetos. Más bien, son algo similar a los espacios de nombres, con la diferencia de que los espacios de nombres no pueden contener funciones directamente. Así que la razón de los módulos es el de proporcionar una forma para que las funciones del grupo, lógicamente, que no pertenecen a una clase.

    Esto tiene mucho sentido cuando se considera que no todo lo que lógicamente pertenece a una clase. Considere la posibilidad de System.Math. No hay absolutamente ninguna razón para hacer que una clase, que no sea un extraño OOP purismo.

    Por el camino, no se puede hacer referencia estática de las clases en C#, al menos no si he entendido bien lo que quieres decir por «referencia». Tal vez usted puede aclarar esto.

    • Yo siempre he pensado eso, pero entonces, ¿qué hay de malo con la colocación de entonces en un «Compartida» de la clase? Si una Función de toma de datos, se hace un cálculo, y escupe resultados, sin necesidad de utilizar o modificar de cualquier otra cosa aparte de los datos de entrada, ¿por qué no puedo estar en una clase y marcado como «Compartida»?
    • La pregunta es: ¿por qué debería? ¿Qué ventaja que tiene la clase? La programación orientada a objetos como paradigma sólo es útil si se tiene una ventaja. Clases sin datos (y sin que ello de lugar como un tipo de marcador) no sirven a ningún propósito.
    • ¿por qué debería un «genérico» incluso residir con la burbuja de una Clase? ¿Por qué no residen en el espacio de nombres? o mejor aún, en la propia Biblioteca. Si no tiene ninguna relevancia para la Clase o espacio de Nombres, ¿por qué debería estar ligada a uno? Los módulos son una Biblioteca ámbito de la creación de Métodos sin casarse con ellas estrictamente a un Objeto que no describen adecuadamente su uso.
  2. 6

    .NET compiladores pueden tomar cualquier tipo de sintaxis del lenguaje y convertirlo en una .NETA equivalente. A veces hay un uno para uno la correspondencia otras veces no la hay.

    Mediante el .NET Reflector usted puede ver lo que el compilador que realmente está haciendo.

    En VB.NET el módulo existe porque el patrimonio heredado de Visual BASIC y en parte de Microsoft BASIC.

    La VB.NET compilador tomará este

    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

    Y convertirlo en esto (código de izquierda a cabo por razones de brevedad)

    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

    En C# el equivalente es este

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

    Todo lo que importa es que el emite CIL hace el trabajo correctamente.

    Esta capacidad es la principal razón por la cual muchas de las más antiguas de Visual BASIC 6 programadores están muy molestos por MS de cambios en el lenguaje. Por ejemplo, la palabra clave Entero de la emisión de un Int32 en lugar de un Int16.

    Módulos están expuestos a otras asambleas referencia al ensamblado original mientras el módulo está declarada pública.

    • Aclaración, BasicA nunca fue propiedad de Microsoft….Microsoft comenzó la propiedad alrededor de QBasic. Basic
  3. 1

    Tal vez los métodos/subs no son públicos? Yo tuve ese problema de una vez, y se permitiría el acceso a locales de código en su clase, pero no se si es que estaba fuera de su clase y marcado como «Privado».

  4. 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
    • estás tratando de sobrescribir respuesta.redirigir con una función de javascript >.<
  5. -1

    No entiendo lo que están pidiendo.

    VB.NET hace han clases estáticas, como en C#, ya que en VB.NET un Module ES un static class. Ellos son uno y el mismo. Cualquier cosa que usted puede hacer con una clase estática que se puede hacer con un Módulo. Tal vez usted no ha marcado su Público/Privado/acceso Protegido correctamente?

    • no, ellos no son de la misma en un nivel de lengua. En particular, los módulos implícitamente importar sus nombres en el espacio de nombres actual. Esto significa que usted no tiene un prefijo del módulo de nombres con el nombre del módulo al referirse a ellos (siempre que el módulo de los alrededores de espacio de nombres es importado).
    • La información no es correcta….Module NO un static class

Dejar respuesta

Please enter your comment!
Please enter your name here