Pregunta

¿Existe una forma estándar para que funcionen los cargadores de clase .NET?

Digamos que compilé este código:

Option Strict On : Option Explicit On

Module Module1
    Sub Main()
        System.Diagnostics.Debug.WriteLine("Main")
        Dim g = C.A
    End Sub
End Module

Public Class C
    Shared Sub New()
        System.Diagnostics.Debug.WriteLine("Init C")
    End Sub
    Shared Property A As New A
End Class

Public Class A
    Shared Sub New()
        System.Diagnostics.Debug.WriteLine("Init A")
    End Sub
    Public Sub New()
        System.Diagnostics.Debug.WriteLine("A Constructor")
    End Sub
End Class

¿Puedo garantizar que el código compilado (en todas las plataformas implementadas) tendrá la siguiente salida?

Main
Init A
A Constructor
Init C
¿Fue útil?

Solución

Debido a que está utilizando constructores y no una inicialización en línea, el compilador VB no marca los tipos con beforefieldinit, y el pedido está exactamente controlado.

Sin embargo, si escribió lo siguiente (usando inicialización en línea):

Option Strict On : Option Explicit On

Module Module1
    Sub Main()
        System.Console.WriteLine("Main")
        Dim g = C.A
    End Sub
End Module
Public Class C
    Shared Function Narg() As A
        Dim alpha As New A
        System.Console.WriteLine("Init C")
        Return alpha
    End Function
    Shared Property A As A = Narg()
End Class
Public Class A
    Shared Sub New()
        System.Console.WriteLine("Init A")
    End Sub
    Public Sub New()
        System.Console.WriteLine("A Constructor")
    End Sub
End Class

El pedido no se especificaría. Se permitiría el mismo pedido que su código original, pero C se puede inicializar anteriormente. De hecho, en mi sistema la salida es:

Init A
A Constructor
Init C
Main

La razón es que C ahora está marcado beforefieldinit.


Picking gratuito: no, no se garantiza que su código original tenga esa salida. En una versión de lanzamiento no tendrá salida, porque System.Diagnostics.Debug se llama condicionalmente.

Otros consejos

Sí, el orden de llamar a los constructores estáticos y de instancia es parte de la especificación del lenguaje. Todos los compiladores conformes deben emitir la misma IL para este programa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top