Udostępnij za pośrednictwem


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. Umożliwia on węzłom trzymanie na obiekcie IList<T> 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 przechowują określoną liczbę argumentów (na przykład Block2, , Block2). Block4 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 wpisana na IList<T> wartość zamiast ReadOnlyCollection<T>. Gdy węzeł jest początkowo skonstruowany, jest tablicą. 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 zwiększa poziom tablicy do obiektu ReadOnlyCollection<T>.

W przypadku przypadku obiektu pierwszy argument jest przechowywany w polu wpisanym do 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 wewnętrznej Expression.ReturnObject<T>(System.Object) pomocnika, aby zwrócić obiekt obsługujący literę Expression 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 te same ReadOnlyCollection<T>wartości . W przeciwnym razie spacernik drzewa ponownego tworzenia używany przez odwiedzających wyrażenie zostanie przerwany. Jest to zmiana powodująca niezgodność z LINQ w wersji 1, 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

ArgumentCount

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

Metody

GetArgument(Int32)

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

Dotyczy