私は、どの中間言語コードが出力されるかを理解する目的で、 LINQPadのいくつかのC#ステートメントで遊んでいます。
私は最初に次のコードを試しました:
var Container = new {Name = "James"};
Console.WriteLine(Container.Name);
そして、次の6行のILが放出されるのを見ました。
IL_0001: ldstr "James"
IL_0006: newobj <>f__AnonymousType0<System.String>..ctor
IL_000B: stloc.0
IL_000C: ldloc.0
IL_000D: callvirt <>f__AnonymousType0<System.String>.get_Name
IL_0012: call System.Console.WriteLine
これは、私が期待していることであり、set_Nameプロパティがないため、匿名型が読み取り専用/不変である方法を示す非常に優れたデモンストレーションです。
次に、私はステートメントを試しました:
dynamic Container = new System.Dynamic.ExpandoObject();
Container.Name = "James";
Console.WriteLine(Container.Name);
これにより、大量のILが放出されます。ここには貼り付けませんが、このペーストビンにあります。
System.Console.WriteLine
動的型とExpandoObjectの管理に関してかなりのオーバーヘッドがあることは理解していますが、この場合の呼び出しが内部反射によって実行されているように見える理由がわかりません。
IL_0072: ldstr "WriteLine"
....
IL_00BF: ldtoken System.Console
コードの最初のセグメントでは、プロパティが取得されて保存された後、を呼び出したのは1行のILステートメントでしたSystem.Console.WriteLine
。
では、なぜdynamic
タイプを使用した呼び出しにこのすべての追加が必要なのですか?