1

Eric Gunnerson のブログ「仮想関数はインライン化されていません」から引用しましたが、仮想メソッドとしての資格は何ですか? MSDN は次のように定義しています。

「インスタンス メソッドの宣言に仮想修飾子が含まれている場合、そのメソッドは仮想メソッドであると言われます。仮想修飾子が存在しない場合、そのメソッドは非仮想メソッドであると言われます。」- MSDN ソース

厳密には、override メソッドを持つ派生クラスpublic override void SomeMethod(){}" には " という単語が含まれていないvirtualので、インライン化できますか?

編集: 具体的には、オーバーライドされたメソッドがインライン化の候補であるかどうかが問題です。これは、私が提供した 2 つのリンクがオーバーライドされたメソッドについて曖昧すぎるためです。

4

2 に答える 2

5

§1.6.6.4 C# 4.0 仕様の仮想、オーバーライド、および抽象メソッドから (古いバージョンを引用していました):

仮想メソッドは、派生クラスでオーバーライドできます。インスタンス メソッドの宣言にoverride修飾子が含まれている場合、メソッドは継承された仮想メソッドを同じシグネチャでオーバーライドします。仮想メソッド宣言が新しいメソッドを導入するのに対し、オーバーライド メソッド宣言は、そのメソッドの新しい実装を提供することによって、既存の継承された仮想メソッドを特殊化します。

したがって、overrideメソッドを作成するときは、実際には新しいメソッドを作成しているのではなく、メソッドをオーバーライドしているだけです。そしてvirtual、それは でなければならないので、実際に呼び出しているメソッドは仮想です。

そうは言っても、仮想メソッドをインライン化できる場合があります。問題のオブジェクトのコンパイル時の型が である場合、sealed実行するコードに疑いの余地はありません。(.Netは実際にはこの最適化を使用していないと思います。)

ただし、それ以外の場合は、仮想メソッドをインライン化できません。

于 2013-02-11T23:56:36.980 に答える
0

仮想メソッドをオーバーライドするメソッドは間違いなく仮想です。多くの点で、それらはすべてオーバーライドするメソッドと同じです。彼らはvtableと呼ばれるものを使用します。あなたが参照しているブログのポイントは、コンパイラができることを最適化するということですが、仮想/オーバーライドされたメソッドにはルックアップが含まれているため、単純化することはできません。

于 2013-02-12T00:00:42.317 に答える