共用方式為


與語意協作

語法樹 狀結構代表原始碼的語彙和語法結構。 雖然此資訊本身就足以描述來源中的所有宣告和邏輯,但無法識別所參考的內容。 名稱可能代表:

  • 類型
  • 欄位
  • 方法
  • 局部變數

雖然每一個都是唯一不同的,但判斷標識符實際參考哪一個通常需要深入瞭解語言規則。

原始程式碼中有程式元素,程式也可以參考先前編譯的程式庫,這些程式庫封裝在組件檔中。 雖然沒有原始程式碼,因此無法創建語法節點或樹狀結構來針對組件,但程式仍然可以參考其中的元素。

針對這些工作,您需要 語意模型

除了原始程式碼的語法模型之外,語意模型也會封裝語言規則,讓您輕鬆地將標識元與所參考的正確程序專案相符。

彙編

編譯是編譯 C# 或 Visual Basic 程式所需的所有專案表示法,其中包含所有元件參考、編譯程式選項和原始程式檔。

由於這項資訊全都放在一個地方,因此可以更詳細地描述原始程式碼中包含的元素。 編譯過程將每個宣告的類型、成員或變數表示為符號。 此編譯包含多種方法,可協助您尋找並關聯在原始程式碼中宣告的符號,或從組件匯入作為元數據的符號。

與語法樹狀結構類似,編譯是不可變的。 建立編譯之後,您無法或您可能與其共用的任何其他人變更編譯。 不過,您可以從現有的編譯中創建新的編譯,並在此過程中指定變更。 例如,您可以建立一個在各方面都與現有集合相同的集合,僅額外包含一個來源檔案或組件參考。

符號

符號代表原始程式碼所宣告或從組件匯入作為中繼資料的獨特元素。 每個命名空間、類型、方法、屬性、欄位、事件、參數或局部變數都會以符號表示。

類型上的 Compilation 各種方法和屬性可協助您尋找符號。 例如,您可以依其通用元資料名稱尋找宣告類型的符號。 您也可以存取整個符號表,作為以全域命名空間為根的符號樹。

符號也包含編譯程式從來源或元數據判斷的其他資訊,例如其他參考的符號。 每種符號都是以衍生自 ISymbol的個別介面來表示,每個介面都有自己的方法和屬性,詳細說明編譯程式收集的資訊。 其中許多屬性會直接參考其他符號。 例如, IMethodSymbol.ReturnType 屬性會告訴您方法傳回的實際類型符號。

符號在原始程式碼和元數據之間呈現命名空間、類型和成員的通用表示法。 例如,在原始程式碼中宣告的方法,以及從元數據匯入的方法,都是以 IMethodSymbol 具有相同屬性的 來表示。

符號在概念上與 API 所代表 System.Reflection 的 CLR 類型系統類似,但它們更豐富,因為它們模型不只是類型。 命名空間、局部變數和標籤都是符號。 此外,符號是語言概念的表示法,而不是CLR概念。 有很多重疊,但也有許多有意義的區別。 例如,C# 或 Visual Basic 中的反覆運算器方法是單一符號。 不過,當反覆運算器方法轉譯為CLR元數據時,它是一種類型和多個方法。

語意模型

語意模型代表單一原始程式檔的所有語意資訊。 您可以使用它來探索以下內容:

  • 來源中特定位置參考的符號。
  • 任何表達式的結果型別。
  • 所有診斷,都是錯誤和警告。
  • 變數進出來源區域的方式。
  • 更多猜測性問題的答案。