2

クラスを直接使用するのではなく、インターフェイスを介してクラスを使用することの意味は何ですか?

たとえば、クラスを直接IList<Int32>使用するのではなく、インターフェイスを介して整数のリストを変更する場合です。List<Int32>これにより、ボクシング変換、より多くの型チェック、nullチェック、より多くのレベルの間接参照、仮想呼び出し、最適化の削減、メソッドのインライン化の防止が導入されますか?もしそうなら、どうすればその一部を軽減できますか?

私は、すべてのコレクションクラスがそれらのインターフェイスを介して使用されることを意図したライブラリを作成しています。このライブラリは、高性能な設定で使用したい他の開発者向けです。

4

1 に答える 1

1

ボクシング

classAFAIK、実装タイプが参照(つまり)タイプである場合、インターフェースは追加のボクシングを導入しません。実装型自体が値型(つまりa struct)である場合、その値型は、インターフェイス型の変数に割り当てられたときにボックス化されます。

struct Foo : IFooBar { … }           class Bar : IFooBar { … }
IFooBar foo = new Foo();             IFooBar bar = new Bar();
//          ^                                    ^
//       boxing                              no boxing

これは、インターフェイスタイプが参照型のように扱われるためです。-typed変数には割り当てることができますがnullIFooBar-typed変数には割り当てられないことに注意してFooください。

補足:実装タイプがである場合はstruct、おそらくこの質問も参照してください。

仮想ディスパッチ

ただし、インターフェイスメソッドを実装するメソッドは、内部では仮想メソッドと同様に扱われます。つまり、実装メソッドを宣言していなくても、仮想メソッドのようにディスパッチテーブルにスロットを取得しますvirtual

これについてはあまり心配しないでください。仮想メソッドのディスパッチは、オブジェクト指向言語では問題と見なされるべきではありません。これは正常なことです。これが原因でパフォーマンスの問題が発生する可能性はほとんどありません。

于 2013-02-15T11:57:09.427 に答える