代碼調用了ToString方法,但編譯器生成了兩份緩存。
如果是在循環中:
代碼:
using System;
namespace Xianfen.Net.TestDynamic
{
class Program
{
static void Main()
{
dynamic d = 5;
for (int i = 0; i < 100; i++)
{
d.ToString();
}
}
}
}
反編譯代碼:
internal class Program
{
// Methods
private static void Main()
{
object d = 5;
for (int i = 0; i < 100; i++)
{
if (<Main>o__SiteContainer0.<>p__Site1 == null)
{
<Main>o__SiteContainer0.<>p__Site1 = CallSite<Action<CallSite, object>>.Create(new CSharpInvokeMemberBinder(CSharpCallFlags.None, "ToString", typeof(Program), null, new CSharpArgumentInfo[] { new CSharpArgumentInfo(CSharpArgumentInfoFlags.None, null) }));
}
<Main>o__SiteContainer0.<>p__Site1.Target (<Main>o__SiteContainer0.<>p__Site1, d);
}
}
// Nested Types
[CompilerGenerated]
private static class <Main>o__SiteContainer0
{
// FIElds
public static CallSite<Action<CallSite, object>> <>p__Site1;
}
}
可見在循環中,相同的操作做了一次緩存;但非循環環境下, 調用一次會緩存一次,猜測原因是,重復調用一個方法的次數不會太多,並且很 多情況准確查找起來比較困難。
(以上代碼在VS2010Beta1下測試通過)