Domanda

C'è un modo standard per caricatori di classi .NET per lavoro?

Say I compilare il codice:

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

Posso garantire il codice compilato sarà (in tutte le piattaforme implementate) hanno il seguente output?

Main
Init A
A Constructor
Init C
È stato utile?

Soluzione

Poiché si utilizza costruttori e inizializzazione non in linea, il compilatore VB non segna i tipi con beforefieldinit, e l'ordine è esattamente controllato.

Se, tuttavia, si ha scritto quanto segue (inizializzazione in linea utilizzando):

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

l'ordine sarebbe stato specificato. Lo stesso ordine il tuo codice originale sarebbe stato permesso, ma C può essere inizializzato in precedenza. Infatti, sul mio sistema l'output è:

Init A
A Constructor
Init C
Main

La ragione è che C ormai è segnato beforefieldinit.


Gratuitous pignoleria: No, il codice originale non è garantito per avere tale uscita. Su una build di rilascio non avrà alcuna uscita, perché System.Diagnostics.Debug è condizionatamente chiamato.

Altri suggerimenti

Sì, l'ordine di chiamare costruttori statici e di istanza è parte della specifica del linguaggio. Tutti i compilatori conformi dovrebbero emettere la stessa IL per questo programma.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top