IArgumentProvider インターフェイス

定義

複数のツリー ノード (DynamicExpression、ElementInit、MethodCallExpression、InvocationExpression、NewExpression および IndexExpression) の引数にアクセスするための内部インターフェイスを提供します。 この API は、内部でだけ使用します。

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

注釈

この API を使用しないでください。 アセンブリのリファクタリングによってのみパブリックであり、内部パフォーマンスの最適化のためにのみ存在します。 これにより、ツリーのサイズを小さくする 2 つの最適化が可能になります。

  1. これにより、ノードIList<T>ReadOnlyCollection<T>は 、 . これにより、各ノードに読み取り専用コレクションを割り当てるコストが節約されます。

  2. これにより、特定の数の引数を保持する特殊なサブクラスを作成できます (例: Block2, , Block2``Block4)。 したがって、これらのノードは、要素を格納するための a ReadOnlyCollection<T> と配列の両方を割り当てることを回避し、ノードあたり 32 バイトを節約します。 この手法は、など、BlockExpressionInvocationExpressionさまざまなノードで使用されますMethodCallExpression

式ツリー ノードは、オブジェクトの元の ReadOnlyCollection<T> LINQ プロパティを引き続き公開します。 これを行うには、通常は配列に格納される配列または要素の両方を格納するフィールドを再利用します。

配列の場合は、コレクションの代わりにReadOnlyCollection<T>型指定されますIList<T>。 ノードが最初に構築されるときは、配列です。 このライブラリのコンパイラまたはユーティリティは、このインターフェイスを介して要素にアクセスします。 配列要素にアクセスすると、配列 ReadOnlyCollection<T>が .

オブジェクトケースの場合、最初の引数は型指定されたフィールドに Object格納されます。 ノードが最初に構築されるときに、このフィールドは最初の引数を保持 Expression します。 このライブラリのコンパイラとユーティリティが引数にアクセスすると、再びこのインターフェイスが使用され、最初の引数のアクセサーは内部Expression.ReturnObject<T>(System.Object)ヘルパー メソッドを使用して、または大文字とReadOnlyCollection<T>小文字を処理するオブジェクトをExpression返します。 ユーザーがアクセス ReadOnlyCollection<T>すると、オブジェクト フィールドが更新され、 ReadOnlyCollection<T>.

プロパティが一貫して同じReadOnlyCollection<T>を返すのExpressionが重要です。 それ以外の場合、式の訪問者によって使用される書き換えツリー ウォーカーが壊れます。 LINQ v1 から同じExpressionノードとは異なる破壊的ReadOnlyCollection<T>変更が返されます。 現在、ユーザーはオブジェクト ID に依存して、ノードが変更されたかどうかを確認できます。 オーバーロードされたフィールドに ReadOnlyCollection<T> 格納すると、メモリ使用量が減り、パブリック API の互換性が維持されます。

プロパティ

ArgumentCount

式ツリー ノードに引数の数を返します。 この API は、内部でだけ使用します。

メソッド

GetArgument(Int32)

index の引数を返し、index が範囲外にある場合にスローします。 この API は、内部でだけ使用します。

適用対象