IArgumentProvider インターフェイス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
複数のツリー ノード (DynamicExpression、ElementInit、MethodCallExpression、InvocationExpression、NewExpression、IndexExpression) の引数にアクセスするための内部インターフェイスを提供します。 この API は内部でのみ使用されます。
public interface class IArgumentProvider
public interface IArgumentProvider
type IArgumentProvider = interface
Public Interface IArgumentProvider
- 派生
注釈
この API は使用しないでください。 アセンブリのリファクタリングによってのみパブリックになり、内部パフォーマンスの最適化にのみ存在します。 これにより、ツリーのサイズを小さくする 2 つの最適化が可能になります。
これにより、ノードはIList<T>ではなくReadOnlyCollection<T>に保持できます。 これにより、ノードごとに読み取り専用コレクションを割り当てるコストが節約されます。
これにより、特定の数の引数 (
Block2、Block2、Block4など) を保持する特殊化されたサブクラスを作成できます。 したがって、これらのノードは、要素を格納するための ReadOnlyCollection<T> と配列の両方を割り当てることを回避し、ノードあたり 32 バイトを節約します。 この手法は、 BlockExpression、 InvocationExpression、 MethodCallExpressionなど、さまざまなノードで使用されます。
式ツリー ノードは、 ReadOnlyCollection<T> オブジェクトの元の LINQ プロパティを引き続き公開します。 これを行うには、通常は配列に格納される配列または要素の両方を格納するためのフィールドを再利用します。
配列の場合、コレクションはIList<T>ではなくReadOnlyCollection<T>に型指定されます。 ノードが最初に構築されるとき、それは配列です。 このライブラリのコンパイラまたはユーティリティは、このインターフェイスを介して要素にアクセスします。 配列要素にアクセスすると、配列が ReadOnlyCollection<T>に昇格します。
オブジェクトの場合、最初の引数は、 Objectに入力されたフィールドに格納されます。 ノードが最初に構築されるときに、このフィールドは最初の引数の Expression を保持します。 このライブラリのコンパイラとユーティリティが引数にアクセスすると、再びこのインターフェイスが使用され、最初の引数のアクセサーは内部 Expression.ReturnObject<T>(System.Object) ヘルパー メソッドを使用して、 Expression または ReadOnlyCollection<T> ケースを処理するオブジェクトを返します。 ユーザーが ReadOnlyCollection<T>にアクセスすると、オブジェクト フィールドが更新され、 ReadOnlyCollection<T>に直接保持されます。
Expressionプロパティは常に同じReadOnlyCollection<T>を返す必要があります。 そうしないと、式の訪問者によって使用されるリライター ツリー ウォーカーが中断されます。 LINQ v1 から、同じReadOnlyCollection<T> ノードから異なるExpressionを返すという破壊的変更です。 現在、ユーザーはオブジェクト ID に依存して、ノードが変更されたかどうかを確認できます。 オーバーロードされたフィールドに ReadOnlyCollection<T> を格納すると、メモリ使用量が削減され、パブリック API の互換性が維持されます。
プロパティ
| 名前 | 説明 |
|---|---|
| ArgumentCount |
式ツリー ノードに対する引数の数を返します。 この API は内部でのみ使用されます。 |
メソッド
| 名前 | 説明 |
|---|---|
| GetArgument(Int32) |
|