この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

IArgumentProvider インターフェイス

 

公開日: 2016年10月

複数のツリー ノード (DynamicExpression、ElementInit、MethodCallExpression、InvocationExpression、NewExpression および InexExpression) の引数にアクセスするための内部インターフェイスを提供します。 この API を使用しないでください。 これは、DLL リファクタリングのためパブリックでのみ使用でき、内部パフォーマンスの最適化のためだけに存在します。

これにより、2 つの最適化を図り、式ツリーのサイズを縮小できます。 最初の最適化により、ツリー ノードは ReadOnlyCollection の代わりに IList<T> に保持されます。 IList<T> は、各ノードの ReadOnlyCollection の割り当てコストを削減します。 2 つ目の最適化により、特定の数の引数 (Block2、Block3、Block4 など) に保持される特殊なサブクラスを作成します。 そのため、これらのノードは ReadOnlyCollection およびその要素を格納するための配列の両方の割り当てを回避します。その結果、各ノードにつき 32 バイト節約されます。

式ツリー ノードは引き続き、ReadOnlyCollections のオリジナル LINQ プロパティを公開します。 ノードは、配列または配列に通常格納される要素を格納するフィールドを再利用することにより、これを行います。

配列の場合、コレクションは ReadOnlyCollection<T> の代わりに IList<T> に型指定されます。 ノードは最初に配列として構築されます。 コンパイラがメンバーにアクセスするときに、このインターフェイスを使用します。 配列要素へアクセスすることにより、配列を ReadOnlyCollection に昇格させます。

オブジェクトの場合、オブジェクトに型指定されたフィールドに最初の引数を格納します。 ノードが最初に構築されるときに、フィールドは式を保持します。 コンパイラは、このインターフェイスから引数にアクセスし、最初の引数のアクセサーはExpression.ReturnObject を使用して、式または ReadOnlyCollection ケースを扱うオブジェクトを返します。 ユーザーが ReadOnlyCollection にアクセスするときに、ReadOnlyCollection に直接格納するためオブジェクト フィールドが更新されます。

式が一貫して同じ ReadOnlyCollection を返すことが重要です。 そうでなければ、リライター ツリー ウォーカーが解除されます。 LINQ v1 からの互換性に影響する変更点として、異なる ReadOnlyCollections が、同じ Expression ノードを形成します。 現在ユーザーは、オブジェクト ID を使用してノードが変更されたかどうかを確認できます。 ReadOnlyCollection をオーバー ロードされたフィールドに格納すると、メモリ使用を削減し、パブリック API の互換性を維持します。

名前空間:   System.Linq.Expressions
アセンブリ:  System.Core (System.Core.dll 内)

public interface IArgumentProvider

名前説明
System_CAPS_pubpropertyArgumentCount

式ツリー ノードに引数の数を返します。 この型は使用しないでください。 これは、アセンブリ リファクタリングのためパブリックのみで、パフォーマンスの最適化のために内部で使用されます。

名前説明
System_CAPS_pubmethodGetArgument(Int32)

インデックスの引数を返し、インデックスが範囲外にある場合にスローします。 この型は使用しないでください。 これは、アセンブリ リファクタリングのためパブリックのみで、パフォーマンスの最適化のために内部で使用されます。

ユニバーサル Windows プラットフォーム
10 以降で使用可能
.NET Framework
4.6 以降で使用可能
トップに戻る
表示: