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 hanya publik 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> ke alih-alih ReadOnlyCollection<T>. Ini menghemat biaya alokasi koleksi baca-saja untuk setiap simpul.

  2. Ini memungkinkan subkelas khusus untuk dibuat yang berpegang pada sejumlah argumen tertentu (misalnya, Block2, Block2, Block4). Oleh karena itu, simpul ini menghindari alokasi array ReadOnlyCollection<T> dan untuk menyimpan elemennya, sehingga menghemat 32 byte per simpul. Teknik ini digunakan oleh berbagai node, termasuk BlockExpression, , InvocationExpressiondan 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 di ketik ke Object. Ketika node awalnya dibangun, bidang ini menyimpan Expression argumen pertama. Ketika kompilator dan utilitas di pustaka ini mengakses argumen, mereka kembali menggunakan antarmuka ini, dan aksesor 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, walker pohon rewriter 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 baik mengurangi penggunaan memori dan mempertahankan kompatibilitas untuk API publik.

Properti

Nama Deskripsi
ArgumentCount

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

Metode

Nama Deskripsi
GetArgument(Int32)

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

Berlaku untuk