Возьмите этот пример кода:
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
Выход New Bar()
:
Dependent created. Dependent upon nothing.
Independent created. Dependent upon nothing.
Кажется, что поля инициализируются в том же порядке, в каком они появляются в исходном коде, что (а) приводит к неожиданному результату и (б) кажется немного озадачивающим, учитывая, что обычно не разрешается читать из неинициализированного переменные в .NET, но, похоже, выше работает нормально.
Я бы ожидал, что VB.NET будет достаточно умен, чтобы сначала инициализировать ссылочные поля, а затем только те, которые ссылаются на него; то есть я бы хотел увидеть этот вывод вместо этого:
Independent created. Dependent upon nothing.
Dependent created. Dependent upon Independent.
Кто-нибудь знает, как заставить VB.NET вести себя так, а не просто менять порядок объявления dependent
и independent
внутри класса Bar
?