私はLINQPadのいくつかのC#ステートメントを使って、どの中間言語コードが生成されているかを理解しています。C#の動的型は、ILで反映されたConsole.WriteLineを解決します
私が最初に次のコードを試してみました:
var Container = new {Name = "James"};
Console.WriteLine(Container.Name);
を放出されたILの次の6つの行を見た:
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の膨大な量が放出されます。ここには貼り付けませんが、this pastebinで見つけることができます。
ダイナミックタイプとExpandoObjectの管理に関してかなりのオーバヘッドがあることを理解していますが、System.Console.WriteLine
の呼び出しが内部リフレクションによって実行されたように見える理由がわかりません。コードの最初のセグメントで
IL_0072: ldstr "WriteLine"
....
IL_00BF: ldtoken System.Console
プロパティが取得され、格納された後、それはSystem.Console.WriteLine
を呼び出し一行IL文でした。
dynamic
タイプの通話では、なぜこのすべてが余分に必要ですか?
実際、 'ToString()'トリックは( 'string'に明示的なキャストを追加しない限り)動作しません。 – svick
@svickあなたは正しいです、それに応じて更新されます。 – Servy