私はVB.Netでこの奇妙な動作をしています。現時点で私はいくつかの概念が欠けているのか、それともバグなのかを判断できません。公開共有読み取り専用メンバーは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
のメンバーを作成する必要があります。この結果、の4つのがBaseType.New
にコールされます。それらの呼び出しのそれぞれはそれ自身のタイプをenumValues
リストに追加します。
これらの初期化の後、最後にAnschlussType.TypeFromString
コールが実行されます。そこには、enumValues
のリストを反復するTypeFromStringBase
があります。
これはすべて、DEBUGモードで正常に動作します。
ここで私が得意でない奇妙な部分です。今度はRELEASEモードを試しました。 enumValues.Count
は常に0になります。これは、ロガーが何も印刷しない、つまり反復しない、つまりゼロであることを意味するためです。そこで私はもう少し調査し、ログの文をBaseType.New
に入れました。これはまったくログに記録されません。これはNewが全く実行されないという結論につながります。
私はこのすべてがDEBUGモードと他のサブタイプと同じ問題でPublic Shared ReadOnly
メンバーを持っているで素晴らしいを動作することを強調しましょう。 しかし、ではなく、はリリースモードで動作します。
誰かが私に欠けている可能性のあるヒントを持っていますか?
このLogmanagerはLog4Netとも呼ばれますか?私はそれに取り組んだことはありませんが、これは役に立ちます。http://stackoverflow.com/questions/22490447/log4net-doesn-t-write-log-in-release-mode-console-applicationまた、 [tag:log4net]の場合はログマネージャーのタグであり、追加のヘルプが表示されることがあります。 –
AnschlussTypeの具体的なインスタンスを作成せずにTypeFromStringBase()を呼び出すことができます。卵は鶏の前に行く必要があります。 –
他のすべてのタイプでは、この正確なコードが機能します。それはロガーではない(DEBUGモードでは正常に動作するので(デフォルトの.NETロガー))、鶏卵の問題ではない(このクラスは共有クラスであるため、これは正常に動作するはずである。プログラムの開始点(たとえそうであってはならないとしても、なぜDEBUGの100%のケースで動作しますか?))。編集:私は今、鶏卵問題が存在する可能性があることを見ることができます、私はそれについてもう少し詳しく考えてみましょう。主なDEBUG/RELEASEの質問は依然として立っています。 – Yatekii