2011-06-24 15 views
2

可能性の重複:C#ので
Virtual member call in a constructorC#では、仮想メソッドをコンストラクタから呼び出すのは安全ですか?

、それはコンストラクタから仮想メソッドを呼び出しても安全ですか?言語仕様は何を表していますか?仕様からも引用してください。 安全なは、派生クラスの実装を呼び出すのですか?

この疑問は、C++ではではないので、コンストラクタから仮想関数を呼び出すことは安全です。

+0

いいえ!重複が存在します。近くに投票した! – Nawaz

+0

私はすでに持っています。 –

+1

派生クラスの実装を呼び出すときに「安全」と定義するのはなぜですか? C++の技術(クラスのどの部分が初期化されたかに基づいてメソッドの実装を呼び出す手法)がより安全な選択肢であるという妥当な議論をすることができます。 –

答えて

6

あなたはそれをすることができますが、そうしないでください。私はC#でもあなたに警告を与えると思います。

派生クラスのコンストラクタが呼び出される前にその関数を呼び出すため、関数が派生クラスによってオーバーライドされていると非常に危険です。

+0

C++では、その理由から派生クラスの実装は呼び出されません。 –

+0

@Ben訂正ありがとう。 – Shirik

+2

C++のメモリは完全には初期化されていないかもしれませんが、C#では問題ありません。 – Gabe

1

仮想関数は、一致するコンストラクタがクラス不変式を確立する前に呼び出されるため、安全ではありません。

これとは対照的に、C++では安全です。呼び出される関数は、一致するコンストラクタの間ではなく、呼び出されます。

+0

私は自分の質問を編集し、私が "安全"を意味するものを言った。 – Nawaz

関連する問題