公共共享只读成员在VB.Net?

时间:2016-07-20 14:28:21

标签: vb.net visual-studio

我在VB.Net中有这种奇怪的行为我被困在了。目前我无法确定我是否遗漏了一些概念,或者这是一个错误。

我有一个基类:

Public MustInherit Class BaseType(Of T As BaseType(Of T)) :
    Implements IEquatable(Of BaseType(Of T))
    Protected Sub New(key As Integer, value As List(Of String))
        LogManager.GetLogger("INFO").Info("Strings: " & vbTab & value.Count())
        If key <> -1 Then
            enumValues.Add(CType(Me, T))
        End If
    End Sub

    Protected Shared Function TypeFromStringBase(name As String) As T
        For Each b As T In enumValues
            LogManager.GetLogger("DEBUG").Info(b.Names(0))
            If b.Names.Contains(name) Then
                Return b
            End If
        Next

        Return TypeFromStringBase("Keine")
    End Function
End Class

继承它的类:

Public Class AnschlussType : Inherits BaseType(Of AnschlussType) :
    Implements IEquatable(Of AnschlussType)
    Public Shared ReadOnly Rund As New AnschlussType(1, {"Rund", "1"})
    Public Shared ReadOnly Flach As New AnschlussType(2, {"Flach", "2"})
    Public Shared ReadOnly Gewinde As New AnschlussType(3, {"Gewinde", "3"})
    Public Shared ReadOnly Kein As New AnschlussType(4, {"Kein", "None", "4"})

    Private Sub New(key As Integer, names As String())
        MyBase.New(key, names.ToList())
    End Sub

    Public Shared Function TypeFromString(name As String) As AnschlussType
        Return TypeFromStringBase(name)
    End Function
End Class

这是我不能得到的奇怪部分。第一次调用AnschlussType.TypeFromString("Some String")时,VB应该创建所有Public Shared ReadOnly成员。这导致对BaseType.New四次调用。然后,每个呼叫都将其自己的类型添加到enumValues列表中。

在所有这些初始化之后,最终将执行AnschlussType.TypeFromString调用。在那里,它调用TypeFromStringBase,它迭代我们之前填充的enumValues列表。

这一切在DEBUG模式下都能正常工作。

这是我不能得到的奇怪部分。现在我尝试了RELEASE模式。 enumValues.Count总是保持为0.我假设这是因为记录器没有打印任何东西,这意味着它不会迭代,这意味着它是零。所以我调查了一点,并将记录语句放入BaseType.New。这根本不会记录。这使我得出的结论是New根本没有被执行。

让我强调一下,这一切都在DEBUG模式中很好,而其他子类型在同一事件中有Public Shared ReadOnly个成员。 但这样做在RELEASE模式下工作。

有没有人暗示我可能遗失的东西?

1 个答案:

答案 0 :(得分:0)

  

如果类中存在静态构造函数(第10.11节),则在执行该静态构造函数之前立即执行静态字段初始值设定项。否则,静态字段初始值设定项在首次使用该类的静态字段之前的实现相关时间执行。

假设VB的工作方式与C#类似,那么您的共享(即静态)字段不会被初始化,因为您还没有使用它们。

尝试创建共享构造函数。