次の方法で共有


IArgumentProvider インターフェイス

定義

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

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

注釈

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

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

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

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

配列の場合、コレクションは ではなく にIList<T>ReadOnlyCollection<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 は、内部でだけ使用します。

適用対象