1

このサンプルコードを見てください:

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.

フィールドはソースコードに表示されるのと同じ順序で初期化されているようです。これは、(a)予期しない結果につながり、(b)の初期化されていない変数からの読み取りが通常許可されていないことを考えると、少し不可解に思えます。 NET、それでもそれは上でうまく機能しているようです。

VB.NETは、最初に参照フィールドを初期化し、次にそれを参照するフィールドを初期化するのに十分スマートであると期待していました。つまり、代わりにこの出力を見たかったのです。

Independent created. Dependent upon nothing.
Dependent created. Dependent upon Independent.

クラス内の宣言順序dependentを単純に入れ替えることなく、代わりにVB.NETをそのように動作させる方法を誰かが知っていますか?independentBar

4

1 に答える 1

2

フィールドは常に、宣言された順序で初期化されます。

初期化されていない変数へのアクセスに対する制限は、フィールドではなくローカル変数にのみ適用されます。(それを強制するのは難しすぎるでしょう)

于 2011-06-19T16:56:08.437 に答える