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
)。 したがって、これらのノードは、要素を格納するための 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) |
|