インスタンス変数が初期化される順序を含むVB.NETで特に問題をデバッグした後、私はC#から予想された動作とVB.NETの実際の動作との間に大きな相違があることを発見しました。基本型コンストラクタを呼び出す前にVB.NETでインスタンス変数の初期化を強制できますか?
メモ:この質問は、VB.NETとC#の動作に若干の不一致があります。 以外の回答を提供できない言語の不名誉な人なら、C#、noob "を使うべきです。ここには何もありません。親切に一緒に移動します。
具体的には、私はC# Language Specification(強調追加)によって概説挙動を期待:
インスタンスコンストラクタは、コンストラクタの初期化子を有していない、またはそれがフォーム
base(...)
のコンストラクタ初期化子を有する場合、そのコンストラクタは暗黙的に実行しますそのクラスで宣言されたインスタンスフィールドの変数初期化子によって指定された初期化。 これは、コンストラクタへのエントリ時および直接ベースクラスコンストラクタの暗黙的な呼び出しの前に直ちに実行される一連の割り当てに対応します。変数初期化子は、クラス宣言に現れるテキスト順に実行されます。
言うVB.NET言語仕様の一部とInstance Constructorsに関することコントラスト、(強調追加):
コンストラクタの最初の文の形式
MyBase.New(...)
である場合、コンストラクタは暗黙的に実行しますその型で宣言されたインスタンス変数の変数初期化子によって指定された初期化。 これは、直接ベース型コンストラクタを呼び出した直後に実行される一連の代入に対応します。このような順序付けにより、すべての基本インスタンス変数は、そのインスタンスにアクセスできるステートメントが実行される前に、変数初期化子によって初期化されます。
ここでの矛盾はすぐに明らかです。 C#は、の前にクラスコンストラクターを呼び出すを初期化します。 VB.NETはまったく逆の動作をしますが、のインスタンスフィールドの値を設定する前に、ベースコンストラクタを呼び出す方が好きです。
コードを表示したい場合は、this related questionが発散動作のより具体的な例を示します。残念ながら、VB.NETをC#によって確立されたモデルに従うように強制する方法についてのヒントはありません。
私は、2つの言語の設計者が、問題の可能性のある回避策のような多岐にわたるアプローチを選んだ理由に興味がありません。最終的に私の質問は次のようになります:VB.NETでコードを記述したり構造化したりしてインスタンス変数を初期化する方法がありますかの前に、ベースタイプのコンストラクタはと同じです。 ?
これを変更することは可能ではないと私は考えています。そして、VBコンパイラはこれを行う試みに対して闘うでしょう。このような動作に頼っているのであれば、通常、コード内のどこかに問題があることを示しています。 (他の質問のサンプルコードのように)長い間コンストラクタ内の仮想メンバを呼び出すことについてアドバイスがありました。 –
@Damien:コンストラクタ内で仮想メンバを呼び出すのは悪い習慣です。残念ながら、その決定は私のものではありませんでした。私はフレームワークによって提供される型をサブクラス化し、その仮想メソッドの1つをオーバーライドします。私は問題が私のコードの外にあると確信しています、そして、私がこれを修正するために考えている唯一の事は、私に "醜いハック"を叫びます。 –
も参照してくださいhttp://stackoverflow.com/q/12585555/185593 – serhio