IArgumentProvider インターフェイス


複数のツリー ノード (DynamicExpression、ElementInit、MethodCallExpression、InvocationExpression、NewExpression および IndexExpression) の引数にアクセスするための内部インターフェイスを提供します。Provides an internal interface for accessing the arguments of multiple tree nodes (DynamicExpression, ElementInit, MethodCallExpression, InvocationExpression, NewExpression, and IndexExpression). この API は、内部でだけ使用します。This API is for internal use only.

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


この API を使用しないでください。You should not use this API. リファクタリング、アセンブリのためにだけパブリックと内部パフォーマンスの最適化に対してのみ存在します。It is public only due to assembly refactoring, and it exists only for internal performance optimizations. ツリーのサイズを小さく 2 つの最適化が有効にします。It enables two optimizations that reduce the size of the trees:

  1. これにより、ノードは、上に保持するために、IList<T>の代わりに、ReadOnlyCollection<T>します。It enables the nodes to hold onto an IList<T> instead of a ReadOnlyCollection<T>. これは、各ノード用の読み取り専用コレクションの割り当てのコストを節約できます。This saves the cost of allocating the read-only collection for each node.

  2. 特殊なサブクラスで特定の数の引数をその保留を作成することができます (たとえば、 Block2Block2Block4)。It enables specialized subclasses to be created that hold on to a specific number of arguments (for example, Block2, Block2, Block4). これらのノードが両方の割り当てを回避するため、ReadOnlyCollection<T>とノードにつき 32 バイトを節約できるよう、その要素を格納する配列。Therefore, these nodes avoid allocating both a ReadOnlyCollection<T> and an array for storing their elements, thus saving 32 bytes per node. 含む、さまざまなノードでこの手法が使用されるBlockExpressionInvocationExpression、およびMethodCallExpressionします。This technique is used by various nodes, including BlockExpression, InvocationExpression, and MethodCallExpression.

式ツリーのノードがのオリジナル LINQ プロパティを公開する続行ReadOnlyCollection<T>オブジェクト。The expression tree nodes continue to expose the original LINQ properties of ReadOnlyCollection<T> objects. この操作をこれらには、配列または配列に通常格納される要素の両方を格納するフィールドを再利用します。They do this by reusing a field for storing both the array or an element that would normally be stored in the array.

コレクションに型指定された配列の場合、IList<T>の代わりにReadOnlyCollection<T>します。For the array case, the collection is typed to IList<T> instead of ReadOnlyCollection<T>. ノードが最初に構築されるときに、配列です。When the node is initially constructed, it is an array. コンパイラまたはユーティリティがこのライブラリでこのインターフェイスを通じて要素にアクセスします。The compiler or utilities in this library access the elements through this interface. 配列要素へのアクセス先の配列を昇格、ReadOnlyCollection<T>します。Accessing array elements promotes the array to a ReadOnlyCollection<T>.

型指定されたフィールドにオブジェクトの場合、最初の引数が格納されているObjectします。For the object case, the first argument is stored in a field typed to Object. このフィールドを保持するノードが最初に構築されるときに、Expressionの最初の引数。When the node is initially constructed, this field holds the Expression of the first argument. コンパイラとライブラリのこのユーティリティは、引数をアクセス、もう一度、このインターフェイスを使用すると、最初の引数にアクセサーを使用して、内部Expression.ReturnObject<T>(System.Object)を処理するオブジェクトを返すヘルパー メソッド、ExpressionまたはReadOnlyCollection<T>ケース。When the compiler and utilities in this library access the arguments, they again use this interface, and the accessor for the first argument uses the internal Expression.ReturnObject<T>(System.Object) helper method to return the object that handles the Expression or ReadOnlyCollection<T> case. ユーザーがアクセスするときに、ReadOnlyCollection<T>に直接格納するオブジェクトのフィールドが更新される、ReadOnlyCollection<T>します。When the user accesses the ReadOnlyCollection<T>, the object field is updated to hold directly onto the ReadOnlyCollection<T>.

重要ですがExpressionプロパティが一貫して返す同じReadOnlyCollection<T>します。It is important that Expression properties consistently return the same ReadOnlyCollection<T>. それ以外の場合、式の訪問者によって使用される、リライター ツリー ウォーカーが解除されます。Otherwise, the rewriter tree walker used by expression visitors will break. 返す別の LINQ v1 からの重大な変更のReadOnlyCollection<T>から同じExpressionノード。It is a breaking change from LINQ v1 to return different ReadOnlyCollection<T> from the same Expression node. 現時点では、ユーザーは、ノードが変更されたかどうかに通知するオブジェクトの id を使用できます。Currently, users can rely on object identity to tell if the node has changed. 格納する、ReadOnlyCollection<T>オーバー ロードされたフィールドの両方メモリ使用量を削減し、パブリック API の互換性を維持します。Storing the ReadOnlyCollection<T> in an overloaded field both reduces memory usage and maintains compatibility for the public API.



式ツリー ノードに引数の数を返します。Returns the number of arguments to the expression tree node. この API は、内部でだけ使用します。This API is for internal use only.



index の引数を返し、index が範囲外にある場合にスローします。Returns the argument at index, throwing if index is out of bounds. この API は、内部でだけ使用します。This API is for internal use only.