2016-07-20 5 views
2

私は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メンバーを持っている素晴らしいを動作することを強調しましょう。 しかし、ではなく、はリリースモードで動作します。

誰かが私に欠けている可能性のあるヒントを持っていますか?

+0

このLogmanagerはLog4Netとも呼ばれますか?私はそれに取り組んだことはありませんが、これは役に立ちます。http://stackoverflow.com/questions/22490447/log4net-doesn-t-write-log-in-release-mode-console-applicationまた、 [tag:log4net]の場合はログマネージャーのタグであり、追加のヘルプが表示されることがあります。 –

+0

AnschlussTypeの具体的なインスタンスを作成せずにTypeFromStringBase()を呼び出すことができます。卵は鶏の前に行く必要があります。 –

+0

他のすべてのタイプでは、この正確なコードが機能します。それはロガーではない(DEBUGモードでは正常に動作するので(デフォルトの.NETロガー))、鶏卵の問題ではない(このクラスは共有クラスであるため、これは正常に動作するはずである。プログラムの開始点(たとえそうであってはならないとしても、なぜDEBUGの100%のケースで動作しますか?))。編集:私は今、鶏卵問題が存在する可能性があることを見ることができます、私はそれについてもう少し詳しく考えてみましょう。主なDEBUG/RELEASEの質問は依然として立っています。 – Yatekii

答えて

0

クラスに静的コンストラクタ(10.11節)が存在する場合、その静的コンストラクタを実行する直前に静的フィールド初期化子が実行されます。それ以外の場合、静的フィールド初期化子は、そのクラスの静的フィールドを最初に使用する前の実装依存の時間に実行されます。

VBはC#のように動作すると仮定すると、共有(静的)フィールドは使用していないため初期化されません。

共有コンストラクタを作成してみてください。

+0

まあ私はそれもC#と同じであると仮定します。それはデフォルトのctorを持っていませんか?また、なぜDEBUGモードで動作しますが、RELEASEでは動作しませんか?私たちが見つけたばかりのように:展開するとうまくいきます。 明日あなたの提案をお試しになります。 – Yatekii

+0

DEBUGモードは、多くの最適化をオフにします。デバッガ内で実行すると、コードの解釈方法を変更することもできます。私はそれが原因であると推測していますが、実装の詳細はわかりません。 –

関連する問題