【问题标题】:Can the initialization order of class fields in VB.NET be influenced by references to other fields?VB.NET中类字段的初始化顺序会受到对其他字段的引用的影响吗?
【发布时间】:2011-06-19 16:51:54
【问题描述】:

获取此示例代码:

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.

是否有人知道如何让 VB.NET 表现得像这样,而无需简单地交换 dependentindependent 在类 Bar 内的声明顺序?

【问题讨论】:

    标签: vb.net field initialization-order


    【解决方案1】:

    字段总是按照它们声明的顺序进行初始化。

    访问未初始化变量的限制仅适用于本地变量,不适用于字段。 (这太难执行了)

    【讨论】:

    • 注意:这是由 CLI 定义的,与语言无关。
    • @Richard:这实际上是不正确的。例如,编译器可以将所有字段转换为Lazy&lt;T&gt;s。
    • @SLacks:但是字段仍然会按顺序初始化,但这将是 Lazy&lt;T&gt; 本身的初始化。我确实考虑过一种语言做一些聪明的事情,比如内部类型,以实现 F# 为可咖喱函数所做的事情......但最终单一类型仍然按顺序初始化。
    • 是的,但是你写的初始化器不会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 2010-12-02
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 2017-05-31
    相关资源
    最近更新 更多