メソッド呼び出しとIL命令

「プログラミング .NET Framework 第2版」を読んでいます。

メソッド呼び出しとIL命令

メソッド呼び出しはILコードにおいてcall命令かcallvert命令に変換される。

  • call命令
    • static・インスタンス・仮想
    • 変数を指定する
    • nullはないことを想定
    • 仮想メソッドを非仮想的に呼び出す際に使用される
  • callvert命令
    • インスタンス・仮想
    • null検証コードあり
      • このため、call命令よりも少し動作が遅い
  • いったんメソッドを非仮想で実装したら、将来それを仮想メソッドに変更してはいけない
    • いくつかのコンパイラは非仮想メソッド呼び出しにcall命令を出力するから(予想しない動作になる可能性)

仮想メソッドを最小に

  • 仮想メソッドは非仮想メソッドより遅い
  • 仮想メソッドはコンパイラがインライン化できない
  • バージョン管理の問題
    • 後段で詳細が示されるらしい
  • 多重定義メソッドを用意し、一番複雑なメソッドのみ仮想メソッドにすること

つぶやき

「仮想メソッドを最小に」「いったんメソッドを非仮想で実装したら、将来それを仮想メソッドに変更してはいけない」が並ぶと、virtual指定に対して慎重な気持ちが生まれます。
(…そういえば、継承自体をあまり使わなくなったせいか、virtualにするかどうかで悩む機会自体も減った気がするなあ。コードの書き方が変わったのかな…)