Call,callvirt命令12. ILの call と callvirt の違い
http://d.hatena.ne.jp/siokoshou/20070517
13. ILの call と callvirt の違い
http://d.hatena.ne.jp/siokoshou/20070517
call命令 / callvirt命令違い・挙動
14. ILの call と callvirt の違い
http://d.hatena.ne.jp/siokoshou/20070517
call命令 / callvirt命令違い・挙動
15. ILの call と callvirt の違い
http://d.hatena.ne.jp/siokoshou/20070517
call命令 / callvirt命令違い・挙動
①引数オブジェクトのGetTypeした型のSay
②Base型のSay
③Derived型のSay
④Duck型のSay
16. ILの call と callvirt の違い
http://d.hatena.ne.jp/siokoshou/20070517
call命令 / callvirt命令違い・挙動
①引数オブジェクトのGetTypeした型のSay
②Base型のSay
③Derived型のSay
④Duck型のSay
17. ILの call と callvirt の違い
http://d.hatena.ne.jp/siokoshou/20070517
call命令 / callvirt命令違い・挙動
①引数オブジェクトのGetTypeした型のSay
②Base型のSay
③Derived型のSay
④Duck型のSay
18. ILの call と callvirt の違い
http://d.hatena.ne.jp/siokoshou/20070517
call命令 / callvirt命令違い・挙動
①引数オブジェクトのGetTypeした型のSay
②Base型のSay
③Derived型のSay
④Duck型のSay
19. ILの call と callvirt の違い
http://d.hatena.ne.jp/siokoshou/20070517
call命令 / callvirt命令違い・挙動
①引数オブジェクトのGetTypeした型のSay
②Base型のSay
③Derived型のSay
④Duck型のSay
Editor's Notes Haskell歴、ぶれいすさんにすごいH本を借りて1Pも読まずに返した経歴ががが・・・ みんなすでに知っていると思うけど
From Introduction to the C# Language and the .NET Framework
https://msdn.microsoft.com/ja-jp/library/z1zx9t92.aspx
ソースファイルは別にC#だけじゃなくてF#とかVBとかでもよい
Base(基底クラス) : Baseという文字列とthisの型を表示
Derived (派生クラス): Derivedという文字列とthisの型とメンバ変数の値を表示
Duck(まったく関係ないクラス) : ガーという文字列を表示
ILの call と callvirt の違い
http://d.hatena.ne.jp/siokoshou/20070517 callとcallvirtで
①引数のオブジェクトのGetTypeした型のSay
②Base型のSay
③Derived型のSay
④Duck型のSay
を呼び出すIL命令を動的に生成・実行するメソッドを用意 実行 基底型の各種call命令
3つめのDerivedのSay呼び出しができちゃっています。
Baseはintのメンバを持っていないので初期値0が出力されています。 派生型の各種call命令
派生型に関しては予想通りの出力ですね Duck型の各種call命令
こちらも各種呼べちゃっています。
int iはメンバに持っていますが、nは持っていないのでDerivedのSayの値出力は初期値0になっています。
基底型と派生形の各種callvirt命令
すべて一致して呼べていますね Duck型のcallvirt呼び出しですが、
Base型のSayとしての呼び出しの時点でSystem.AccessViolationExceptionが発生しました。
元記事の2007年の時点ではガー、ガー、ガー、ガーで例外発生せず呼べていたみたいです。
AccessViolationExceptionは無効なポインターによる読み取りまたは書き込み、メモリの破損で発生する 以上のことからわかる挙動の違い GetXがないクラスに対して無理やりxの値を取得できちゃったりもする・・・