Может ли порядок инициализации полей класса в VB.NET зависеть от ссылок на другие поля? - PullRequest
1 голос
/ 19 июня 2011

Возьмите этот пример кода:

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?

1 Ответ

2 голосов
/ 19 июня 2011

Поля всегда инициализируются в порядке, в котором они объявлены.

Ограничение доступа к неинициализированным переменным применяется только к локальным переменным, а не к полям. (это было бы слишком сложно обеспечить)

...