L'ordre d'initialisation des champs de classe dans VB.NET peut-il être influencé par des références à d'autres champs?
-
29-10-2019 - |
Question
Prenez cet exemple de code:
Class Foo
ReadOnly name As String
Public Sub New(name As String, dependentUpon As Foo)
Me.name = name
Console.Write("{0} created. ", name)
Console.WriteLine("Dependent upon {0}.", If(dependentUpon IsNot Nothing,
dependentUpon.Name,
"nothing"))
End Sub
End Class
Class Bar
ReadOnly dependent As New Foo("Dependent", independent) ' <-- !!!
ReadOnly independent As New Foo("Independent", Nothing)
End Class
La sortie de New Bar()
est:
Dependent created. Dependent upon nothing.
Independent created. Dependent upon nothing.
Il semble que les champs soient initialisés dans le même ordre qu'ils apparaissent dans le code source, ce qui (a) conduit à un résultat inattendu, et (b) semble un peu déroutant, étant donné que l'on n'est normalement pas autorisé à lire à partir de variables non initialisées. Net, pourtant cela semble fonctionner bien au-dessus.
Je m'attendrais à ce que VB.NET soit assez intelligent pour initialiser d'abord les champs référencés, et seulement ceux qui le font référence; c'est-à-dire que j'aurais aimé voir cette sortie à la place:
Independent created. Dependent upon nothing.
Dependent created. Dependent upon Independent.
Quelqu'un sait-il un moyen de faire en sorte que VB.net se comporte comme ça à la place, sans simplement avoir à échanger l'ordre de déclaration de dependent
et independent
classe intérieure Bar
?
Pas de solution correcte