Język

IArgumentProvider Interfejs

Definicja

Udostępnia wewnętrzny interfejs umożliwiający uzyskiwanie dostępu do argumentów wielu węzłów drzewa (DynamicExpression, ElementInit, MethodCallExpression, InvocationExpression, NewExpression i IndexExpression). Ten interfejs API jest przeznaczony tylko do użytku wewnętrznego.

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

Uwagi

Nie należy używać tego interfejsu API. Jest ona publiczna tylko ze względu na refaktoryzację zestawu i istnieje tylko w przypadku wewnętrznych optymalizacji wydajności. Umożliwia ona dwie optymalizacje, które zmniejszają rozmiar drzew:

  1. Dzięki temu węzły mogą przechowywać IList<T> element zamiast ReadOnlyCollection<T>. Pozwala to zaoszczędzić koszt przydzielania kolekcji tylko do odczytu dla każdego węzła.

  2. Umożliwia utworzenie wyspecjalizowanych podklas, które posiadają określoną liczbę argumentów (na przykład Block2, , Block2Block4). W związku z tym te węzły unikają przydzielania zarówno tablicy, jak ReadOnlyCollection<T> i do przechowywania ich elementów, co pozwala zaoszczędzić 32 bajty na węzeł. Ta technika jest używana przez różne węzły, w tym BlockExpression, InvocationExpressioni MethodCallExpression.

Węzły drzewa wyrażeń nadal uwidaczniają oryginalne właściwości ReadOnlyCollection<T> LINQ obiektów. Robią to przez ponowne użycie pola do przechowywania zarówno tablicy, jak i elementu, który normalnie będzie przechowywany w tablicy.

W przypadku przypadku tablicy kolekcja jest wpisywana na IList<T> wartość zamiast ReadOnlyCollection<T>. Gdy węzeł jest początkowo skonstruowany, jest to tablica. Kompilator lub narzędzia w tej bibliotece uzyskują dostęp do elementów za pośrednictwem tego interfejsu. Uzyskiwanie dostępu do elementów tablicy promuje tablicę ReadOnlyCollection<T>do obiektu .

W przypadku obiektu pierwszy argument jest przechowywany w polu wpisanym na Object. Gdy węzeł jest początkowo skonstruowany, to pole zawiera Expression pierwszy argument. Gdy kompilator i narzędzia w tej bibliotece uzyskują dostęp do argumentów, ponownie używają tego interfejsu, a metoda dostępu dla pierwszego argumentu używa metody pomocniczej wewnętrznej Expression.ReturnObject<T>(System.Object) w celu zwrócenia obiektu obsługującego Expression ten przypadek lub ReadOnlyCollection<T> . Gdy użytkownik uzyskuje dostęp do ReadOnlyCollection<T>obiektu , pole obiektu jest aktualizowane w celu przechowywania bezpośrednio na obiekcie ReadOnlyCollection<T>.

Ważne jest, aby Expression właściwości stale zwracały ten sam ReadOnlyCollection<T>element . W przeciwnym razie program rewriter tree walker używany przez odwiedzających wyrażenie zostanie przerwany. Jest to zmiana powodująca niezgodność z LINQ v1, która będzie zwracać inny ReadOnlyCollection<T> niż ten sam Expression węzeł. Obecnie użytkownicy mogą polegać na tożsamości obiektu, aby określić, czy węzeł uległ zmianie. ReadOnlyCollection<T> Przechowywanie w przeciążonym polu zmniejsza użycie pamięci i utrzymuje zgodność z publicznym interfejsem API.

Właściwości

Nazwa Opis
ArgumentCount

Zwraca liczbę argumentów do węzła drzewa wyrażeń. Ten interfejs API jest przeznaczony tylko do użytku wewnętrznego.

Metody

Nazwa Opis
GetArgument(Int32)

Zwraca argument w indexparametrze , zgłaszając wartość , jeśli index jest poza granicami. Ten interfejs API jest przeznaczony tylko do użytku wewnętrznego.

Dotyczy