C# 中 COM 類型的無縫整合激發了開發人員的好奇心。本文深入探討編譯器偵測 COM 類型的機制,闡明它如何實現看似異常的操作。
COM 類型處理的一個令人費解的方面是在 C# 中建構 Application 等介面的方式。 C# 編譯器似乎允許對介面呼叫建構函數,這在其他語言中通常是被禁止的行為。這種錯覺是透過隱式呼叫 Type.GetTypeFromCLSID() 來檢索正確的 COM 類,並隨後呼叫 Activator.CreateInstance 來建立該類別的實例來實現的。
此外,C# 4 引入了一項功能,允許開發人員為引用參數提供非引用參數。編譯器會自動建立局部變數以透過引用傳遞,從而有效地丟棄原始值。以下程式碼說明了這種行為:
<code class="language-c#">app.ActiveDocument.SaveAs(FileName: "test.doc");</code>
FileName 參數在技術上是一個引用參數,但程式碼卻傳遞了一個常數值。編譯器透明地處理了這種差異。
嘗試模仿第一種場景(直接實例化介面)已證明是失敗的。但是,可以使用 ref 和 in 修飾符來複製第二種場景,如下所示:
<code class="language-c#">Dummy dummy = null; dummy.Foo(in 10);</code>
與預期的 new Dummy() 構造相反,此程式碼利用 in 修飾符透過引用傳遞變量,而不會更改其值。
編譯器能夠辨識 COM 類型的關鍵在於 CoClass 屬性。透過使用 [CoClass(typeof(Test))] 註解接口,編譯器可以推斷出底層實作類別的存在,並產生必要的程式碼來實例化它。
這項發現為在 C# 中與 COM 類型互動開闢了新的可能性,增強了該語言的互通性能力。
以上是C# 編譯器如何處理看似不尋常的 COM 類型實例化和參數傳遞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!