語言

IArgumentProvider 介面

定義

提供內部介面以存取多個樹節點的參數(DynamicExpression、ElementInit、MethodCallExpression、InvocationExpression、NewExpression 和 IndexExpression)。 此 API 僅供內部使用。

public interface class IArgumentProvider
public interface IArgumentProvider
type IArgumentProvider = interface
Public Interface IArgumentProvider
衍生

備註

你不應該使用這個 API。 它之所以公開,是因為組合語言重構,且僅用於內部效能優化。 它能進行兩種優化,以縮小樹狀結構大小:

  1. 它使節點能保留 一個 IList<T> 而非 ReadOnlyCollection<T>。 這節省了為每個節點分配唯讀集合的成本。

  2. 它使得能建立專門化的子類,這些子類能保留特定數量的參數(例如, Block2, Block2, Block4)。 因此,這些節點避免同時分配 a ReadOnlyCollection<T> 和 a 陣列來儲存元素,從而每個節點節省 32 個位元組。 此技術被多種節點使用,包括 BlockExpression、 InvocationExpression、 MethodCallExpression和 。

表達式樹節點繼續暴露物件的原始 LINQ 屬性 ReadOnlyCollection<T> 。 它們透過重複使用一個欄位來儲存陣列或通常會儲存在陣列中的元素來達成此目的。

在陣列的情況下,集合型別IList<T>ReadOnlyCollection<T>為 。 當節點最初建構時,它是一個陣列。 編譯器或函式庫中的工具可透過此介面存取元素。 存取陣列元素會將陣列升變為 ReadOnlyCollection<T>。

物件情況中,第一個參數儲存在類型為 Object的欄位中。 當節點最初被構造時,這個欄位包含第一個參數的 。Expression 當編譯器和這個函式庫中的工具存取參數時,它們再次使用這個介面,而第一個參數的存取器會使用內部Expression.ReturnObject<T>(System.Object)輔助方法回傳處理 or Expression 案例的ReadOnlyCollection<T>物件。 當使用者存取 時 ReadOnlyCollection<T>,物件欄位會更新為直接 ReadOnlyCollection<T>保持 。

屬性必須 Expression 一致返回相同的 ReadOnlyCollection<T>結果。 否則,訪客使用的重寫樹行者將會失效。 這是從 LINQ v1 中,回傳不同 ReadOnlyCollection<T> 於同一 Expression 節點的重大變更。 目前,使用者可以依賴物件身份來判斷節點是否已變更。 將 儲存 ReadOnlyCollection<T> 在過載欄位中,不僅能減少記憶體使用,也能維持與公開 API 的相容性。

屬性

名稱 Description
ArgumentCount

回傳給表達式樹節點的參數數量。 此 API 僅供內部使用。

方法

名稱 Description
GetArgument(Int32)

回傳參數 , index若 擲出界外 index 。 此 API 僅供內部使用。

適用於