Поделиться через


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 предназначен только для внутреннего использования.

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