首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 4.0 新特性探秘 (四):dynamic 關鍵字 IL 代碼深度解析與值型別裝箱驗證

     編輯:關於C語言

Reflector 反編譯 (設定 .NET 2.0 語法)


internal class Program
{
    private static void Main()
    {
        object d = "str";
        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);
    }
    [CompilerGenerated]
    private static class <Main>o__SiteContainer0
    {
        public static CallSite<Action<CallSite, object>> <>p__Site1;
    }
}

關鍵觀察

  1. 動態變量編譯為 object:dynamic d = "str" → object d = "str"。
  2. CallSite 快取模式:靜態巢狀類別持有 CallSite 欄位,首次使用時建立並快取。
  3. 調用流程:CallSite.Target(CallSite, args) 執行動態綁定。

值型別裝箱驗證


dynamic d = 5; // int
d.ToString();
反編譯同樣為 object d = 5,確認發生 裝箱。動態呼叫值型別會導致額外配置與複製,效能敏感場合需謹慎使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved