IArgumentProvider Интерфейс

Определение

Предоставляет внутренний интерфейс для доступа к аргументам нескольких узлов дерева (DynamicExpression, ElementInit, MethodCallExpression, InvocationExpression, NewExpression и IndexExpression). Этот интерфейс API предназначен только для внутреннего использования.

public interface class IArgumentProvider
public interface IArgumentProvider
type IArgumentProvider = interface
Public Interface IArgumentProvider
Производный

Комментарии

Не следует использовать этот API. Он является общедоступным только из-за рефакторинга сборок и существует только для внутренней оптимизации производительности. Он включает две оптимизации, которые уменьшают размер деревьев:

  1. Он позволяет узлам удерживать IList<T>ReadOnlyCollection<T>вместо . Это позволяет сэкономить затраты на выделение коллекции только для чтения для каждого узла.

  2. Это позволяет создавать специализированные подклассы, которые содержат определенное количество аргументов (например, Block2, Block2, Block4). Таким образом, эти узлы избегают выделения и массива ReadOnlyCollection<T> для хранения своих элементов, тем самым экономя 32 байта на каждом узле. Этот метод используется различными узлами, включая BlockExpression, InvocationExpressionи MethodCallExpression.

Узлы дерева выражений по-прежнему предоставляют исходные свойства ReadOnlyCollection<T> LINQ объектов . Для этого они повторно используют поле для хранения массива или элемента, который обычно хранится в массиве.

В случае массива коллекция вводится IList<T> в , а не ReadOnlyCollection<T>. При первоначальном построении узла это массив. Компилятор или служебные программы в этой библиотеке обращаются к элементам через этот интерфейс. Доступ к элементам массива повышает уровень массива ReadOnlyCollection<T>до .

В случае объекта первый аргумент хранится в поле с типом Object. При первоначальном создании узла это поле содержит Expression первый аргумент. Когда компилятор и служебные программы в этой библиотеке обращаются к аргументам, они снова используют этот интерфейс, а метод доступа для первого аргумента использует внутренний Expression.ReturnObject<T>(System.Object) вспомогательный метод для возврата объекта, обрабатывающего Expression регистр или ReadOnlyCollection<T> . Когда пользователь обращается ReadOnlyCollection<T>к , поле объекта обновляется для удержания непосредственно в ReadOnlyCollection<T>.

Важно, чтобы Expression свойства последовательно возвращали один и тот же ReadOnlyCollection<T>. В противном случае средство перезаписи дерева, используемое посетителями выражений, будет нарушено. Это критическое изменение из LINQ версии 1 для возврата, отличного ReadOnlyCollection<T> от того же Expression узла. В настоящее время пользователи могут полагаться на удостоверение объекта, чтобы определить, изменился ли узел. Хранение ReadOnlyCollection<T> в перегруженном поле сокращает использование памяти и обеспечивает совместимость общедоступного API.

Свойства

ArgumentCount

Возвращает число аргументов для узла дерева выражения. Этот интерфейс API предназначен только для внутреннего использования.

Методы

GetArgument(Int32)

Возвращает аргумент по индексу index, создавая исключение, если индекс index находится вне допустимых границ. Этот интерфейс API предназначен только для внутреннего использования.

Применяется к