2012-03-30 33 views
6

単体テストと模擬に対応するには、メソッドとプロパティを仮想として宣言することが一般的になります。仮想ではないと思われるものを宣言することによるパフォーマンスへの影響はありますか?仮想メソッドのパフォーマンスへの影響

+0

は、ちょうどすべて 'virtual'と、すべてのクラス' open'を作っていますか?うーん... –

+0

@StefanHanke:私は、営業担当者がそれがちょうど*だと思っているとは思わない。 –

+0

ええ、私はそれが必要ではないときに行うべきではないと思う...それは適切なときにテスト容易性を向上させることができるただ一つの尺度だ。 – TGH

答えて

9

一般に、仮想メソッドはCallvirt Opcodeを使用して呼び出されますが、仮想メソッドは標準Call Opcodeを使用しないという違いがあります。 Call OpcodesはCallvirtよりもはるかに高速ですが、これに基づいて設計上の意思決定を正当化するのに十分な程度のものはこれまでにないほどです。

Premature optimization is the root of all evil.

+0

IIRC、C#コンパイラは、仮想であるかどうかにかかわらず、すべてのインスタンスメソッドにCallVirtを使用します。そうすれば、CLRは無効チェックを行います。 –

+0

@JohnSkeetそれで、それは一日の終わりには本当に違いがないということですか? – TGH

+0

良い点John - 私が思う、値型のインスタンスメソッドを除いて、あなたは正しいです。コンパイラがOpcodes.Callを発行します。 – Jeff

1

いいえ、実際はありません。

これはあなたが気づくことではありません。

1

私は詳細を知らないが、私はあなたがそこにアプリケーションの99%のためにそれを心配する必要はありませんことを知っています。

btw - クラスではなくモックインターフェイスを選択すると、仮想メソッドは必要ありません。

幸運、あなたがtestability_ため_design考える トム

+0

あなたは仮想メソッドと同じインダイレクションのペナルティをインターフェースに持っています。 – leppie

関連する問題