Язык

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, ). Block2Block4 Таким образом, эти узлы избегают выделения как массива 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 предназначен только для внутреннего использования.

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