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. 它可建立特製化子類別,以保留特定數目的引數 (,例如 、 Block2Block2 Block4) 。 因此,這些節點可避免配置 ReadOnlyCollection<T> 和 陣列來儲存其元素,因而節省每個節點 32 個位元組。 這項技術是由各種節點使用,包括 BlockExpressionInvocationExpressionMethodCallExpression

運算式樹狀節點會繼續公開物件的原始 LINQ 屬性 ReadOnlyCollection<T> 。 藉由重複使用欄位來儲存陣列或通常儲存在陣列中的元素,即可這麼做。

針對陣列案例,集合的類型為 IList<T> ,而不是 ReadOnlyCollection<T> 。 一開始建構節點時,它是陣列。 此程式庫中的編譯器或公用程式會透過這個介面存取元素。 存取陣列元素會將陣列升階為 ReadOnlyCollection<T>

針對物件案例,第一個引數會儲存在類型為 的 Object 欄位中。 一開始建構節點時,此欄位會保留 Expression 第一個引數的 。 當此程式庫中的編譯器和公用程式存取引數時,它們會再次使用此介面,而第一個引數的 存取子會使用內部 Expression.ReturnObject<T>(System.Object) 協助程式方法來傳回處理 ExpressionReadOnlyCollection<T> 案例的物件。 當使用者存取 ReadOnlyCollection<T> 時,物件欄位會更新為直接保留在 上 ReadOnlyCollection<T>

Expression屬性必須一致地傳回相同的 ReadOnlyCollection<T> 。 否則,運算式訪客所使用的重寫器樹狀結構逐步解說程式將會中斷。 這是 LINQ v1 的重大變更,會從相同的 Expression 節點傳回不同的 ReadOnlyCollection<T> 。 目前,使用者可以依賴物件識別來判斷節點是否已變更。 將 ReadOnlyCollection<T> 儲存在多載欄位中可減少記憶體使用量,並維持公用 API 的相容性。

屬性

ArgumentCount

傳回運算式樹狀節點的引數數目。 此 API 僅供內部使用。

方法

GetArgument(Int32)

傳回位於 index 的引數,如果 index 超出範圍則擲回引數。 此 API 僅供內部使用。

適用於