<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 使用類型 dynamic(C# 編程指南) Visual C# 2010 引入了一個新類型 **dynamic**。該類型是一種靜態類型,但類型為 **dynamic** 的對象會跳過靜態類型檢查。大多數情況下,該對象就像具有類型 **object** 一樣。在編譯時,將假定類型化為 **dynamic** 的元素支持任何操作。因此,您不必考慮對象是從 COM API、從動態語言(例如 IronPython)、從 HTML 文檔對象模型 (DOM)、從反射還是從程序中的其他位置獲取自己的值。但是,如果代碼無效,則在運行時會捕獲到錯誤。 例如,如果以下代碼中的實例方法 exampleMethod1 只有一個形參,則編譯器會將對該方法的第一個調用 ec.exampleMethod1(10, 4) 識別為無效,原因是它包含兩個實參。該調用將導致編譯器錯誤。編譯器不會檢查對該方法的第二個調用 dynamic_ec.exampleMethod1(10, 4),原因是 dynamic_ec 的類型為 **dynamic**。因此,不會報告編譯器錯誤。但是,該錯誤不會被無限期疏忽。它將在運行時被捕獲,并導致運行時異常。 ``` static void Main(string[] args) { ExampleClass ec = new ExampleClass(); // The following call to exampleMethod1 causes a compiler error // if exampleMethod1 has only one parameter. Uncomment the line // to see the error. //ec.exampleMethod1(10, 4); dynamic dynamic_ec = new ExampleClass(); // The following line is not identified as an error by the // compiler, but it causes a run-time exception. dynamic_ec.exampleMethod1(10, 4); // The following calls also do not cause compiler errors, whether // appropriate methods exist or not. dynamic_ec.someMethod("some argument", 7, null); dynamic_ec.nonexistentMethod(); } ``` ``` class ExampleClass { public ExampleClass() { } public ExampleClass(int v) { } public void exampleMethod1(int i) { } public void exampleMethod2(string str) { } } ``` 在這些示例中,編譯器的作用是將有關每個語句的預期作用的信息一起打包到類型化為 **dynamic** 的對象或表達式。在運行時,將對存儲的信息進行檢查,并且任何無效的語句將會導致運行時異常。 大多數動態操作的結果是其本身 **dynamic**。例如,如果將鼠標指針放在以下示例中使用的 testSum 上,則 IntelliSense 將顯示類型**“(局部變量)dynamic testSum”**。 ``` dynamic d = 1; var testSum = d + 3; // Rest the mouse pointer over testSum in the following statement. System.Console.WriteLine(testSum); ``` 結果不是 **dynamic** 的操作包括從 **dynamic** 到另一種類型的轉換,以及包括類型為 **dynamic** 的參數的構造函數調用。例如,以下聲明中 testInstance 的類型為 ExampleClass,而不是 **dynamic**。 ``` var testInstance = new ExampleClass(d); ``` 下一節“轉換”中顯示了轉換示例。 ## 轉換 動態對象和其他類型之間的轉換非常簡單。這樣,開發人員將能夠在動態行為和非動態行為之間切換。 任何對象都可隱式轉換為動態類型,如下面的示例所示。 ``` dynamic d1 = 7; dynamic d2 = "a string"; dynamic d3 = System.DateTime.Today; dynamic d4 = System.Diagnostics.Process.GetProcesses(); ``` 反之,隱式轉換也可動態地應用于類型為 **dynamic** 的任何表達式。 ``` int i = d1; string str = d2; DateTime dt = d3; System.Diagnostics.Process[] procs = d4; ``` ## 使用類型為 dynamic 的參數重載決策 如果方法調用中的一個或多個參數具有類型 **dynamic**,或者方法調用的接收方的類型為 **dynamic**,則會在運行時(而不是在編譯時)進行重載決策。在下面的示例中,如果唯一可訪問的 exampleMethod2 方法定義為接受字符串參數,則將 d1 作為參數發送不會導致編譯器錯誤,但卻會導致運行時異常。重載決策之所以會在運行時失敗,原因是 d1 的運行時類型為 **int**,而 exampleMethod2 需要字符串。 ``` // Valid. ec.exampleMethod2("a string"); // The following statement does not cause a compiler error, even though ec is not // dynamic. A run-time exception is raised because the run-time type of d1 is int. ec.exampleMethod2(d1); // The following statement does cause a compiler error. //ec.exampleMethod2(7); ``` ## 動態語言運行時 動態語言運行時 (DLR) 是 .NET Framework 4 中的一個新 API。它提供了支持 C# 中的 **dynamic** 類型的基礎結構,還提供了諸如 IronPython 和 IronRuby 等動態編程語言的實現。有關 DLR 的更多信息,請參見[動態語言運行時概述](https://msdn.microsoft.com/zh-cn/library/dd233052.aspx)。 ## COM 互操作 Visual C# 2010 包括若干功能,這些功能改善了與 COM API(例如 Office 自動化 API)的互操作體驗。這些改進之處包括 **dynamic** 類型以及[命名參數和可選參數](https://msdn.microsoft.com/zh-cn/library/dd264739.aspx)的使用。 通過將類型指定為 **object**,許多 COM 方法都允許參數類型和返回類型發生變化。這樣,就必須顯式強制轉換值,以便與 C# 中的強類型變量保持協調。如果使用 [/link (C# Compiler Options)](https://msdn.microsoft.com/zh-cn/library/dd264728.aspx) 選項進行編譯,則 **dynamic** 類型的引入使您能夠將 COM 簽名中出現的 **object** 實例看作 **dynamic** 類型,從而避免了大量的強制轉換。例如,下面的語句對比了在使用 **dynamic** 類型和不使用 **dynamic** 類型的情況下如何訪問 Microsoft Office Excel 電子表格中的單元格。 ``` // Before the introduction of dynamic. ((Excel.Range)excelApp.Cells[1, 1]).Value2 = "Name"; Excel.Range range2008 = (Excel.Range)excelApp.Cells[1, 1]; ``` ``` // After the introduction of dynamic, the access to the Value property and // the conversion to Excel.Range are handled by the run-time COM binder. excelApp.Cells[1, 1].Value = "Name"; Excel.Range range2010 = excelApp.Cells[1, 1]; ``` ## 相關主題 | 標題 | 描述 | | --- | --- | | [dynamic(C# 參考)](https://msdn.microsoft.com/zh-cn/library/dd264741.aspx) | 描述 **dynamic** 關鍵字的用法。 | | [動態語言運行時概述](https://msdn.microsoft.com/zh-cn/library/dd233052.aspx) | 提供有關 DLR 的概述,DLR 是一種運行時環境,它將一組適用于動態語言的服務添加到公共語言運行時 (CLR)。 | | [演練:創建和使用動態對象(C# 和 Visual Basic)](https://msdn.microsoft.com/zh-cn/library/ee461504.aspx) | 提供了有關如何創建自定義動態對象以及創建訪問 **IronPython** 庫的對象的分步說明。 | | [如何:通過使用 Visual C# 功能訪問 Office 互操作對象(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/dd264733.aspx) | 演示如何創建一個項目,該項目使用了命名參數和可選參數、**dynamic** 類型以及可簡化對 Office API 對象的訪問的其他增強功能。 |
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看