Bagikan melalui


IArgumentProvider Antarmuka

Definisi

Menyediakan antarmuka internal untuk mengakses argumen beberapa simpul pohon (DynamicExpression, ElementInit, MethodCallExpression, InvocationExpression, NewExpression, dan IndexExpression). API ini hanya untuk penggunaan internal.

public interface class IArgumentProvider
public interface IArgumentProvider
type IArgumentProvider = interface
Public Interface IArgumentProvider
Turunan

Keterangan

Anda tidak boleh menggunakan API ini. Ini bersifat publik hanya karena pemfaktoran ulang perakitan, dan hanya ada untuk pengoptimalan performa internal. Ini memungkinkan dua pengoptimalan yang mengurangi ukuran pohon:

  1. Ini memungkinkan simpul untuk menahan IList<T> alih-alih ReadOnlyCollection<T>. Ini menghemat biaya alokasi koleksi baca-saja untuk setiap simpul.

  2. Ini memungkinkan subkelas khusus dibuat yang berpegang pada sejumlah argumen tertentu (misalnya, Block2, , Block2Block4). Oleh karena itu, simpul ini menghindari alokasi dan ReadOnlyCollection<T> array untuk menyimpan elemennya, sehingga menghemat 32 byte per simpul. Teknik ini digunakan oleh berbagai node, termasuk BlockExpression, InvocationExpression, dan MethodCallExpression.

Simpul pohon ekspresi terus mengekspos properti ReadOnlyCollection<T> LINQ asli objek. Mereka melakukan ini dengan menggunakan kembali bidang untuk menyimpan array atau elemen yang biasanya akan disimpan dalam array.

Untuk kasus array, koleksi di ketikkan ke IList<T> alih-alih ReadOnlyCollection<T>. Ketika node awalnya dibangun, itu adalah array. Pengkompilasi atau utilitas di pustaka ini mengakses elemen melalui antarmuka ini. Mengakses elemen array mempromosikan array ke ReadOnlyCollection<T>.

Untuk kasus objek, argumen pertama disimpan dalam bidang yang ditik ke Object. Ketika simpul awalnya dibangun, bidang ini menyimpan Expression argumen pertama. Ketika pengkompilasi dan utilitas dalam pustaka ini mengakses argumen, mereka kembali menggunakan antarmuka ini, dan pengaktor untuk argumen pertama menggunakan metode pembantu internal Expression.ReturnObject<T>(System.Object) untuk mengembalikan objek yang menangani Expression atau ReadOnlyCollection<T> kasus. Ketika pengguna mengakses ReadOnlyCollection<T>, bidang objek diperbarui untuk menahan langsung ke ReadOnlyCollection<T>.

Penting bahwa Expression properti secara konsisten mengembalikan yang sama ReadOnlyCollection<T>. Jika tidak, rewriter tree walker yang digunakan oleh pengunjung ekspresi akan pecah. Ini adalah perubahan yang melanggar dari LINQ v1 untuk mengembalikan yang berbeda ReadOnlyCollection<T> dari simpul yang sama Expression . Saat ini, pengguna dapat mengandalkan identitas objek untuk mengetahui apakah simpul telah berubah. Menyimpan ReadOnlyCollection<T> di bidang yang kelebihan beban mengurangi penggunaan memori dan mempertahankan kompatibilitas untuk API publik.

Properti

ArgumentCount

Mengembalikan jumlah argumen ke simpul pohon ekspresi. API ini hanya untuk penggunaan internal.

Metode

GetArgument(Int32)

Mengembalikan argumen di index, melempar jika index berada di luar batas. API ini hanya untuk penggunaan internal.

Berlaku untuk