IArgumentProvider Интерфейс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет внутренний интерфейс для доступа к аргументам нескольких узлов дерева (DynamicExpression, ElementInit, MethodCallExpression, InvocationExpression, NewExpression и IndexExpression). Этот интерфейс API предназначен только для внутреннего использования.
public interface class IArgumentProvider
public interface IArgumentProvider
type IArgumentProvider = interface
Public Interface IArgumentProvider
- Производный
Комментарии
Не следует использовать этот API. Он является общедоступным только из-за рефакторинга сборки и существует только для внутренней оптимизации производительности. Это обеспечивает две оптимизации, уменьшающие размер деревьев:
Это позволяет узлам удерживать IList<T>ReadOnlyCollection<T>вместо . Это экономит затраты на выделение коллекции только для чтения для каждого узла.
Он позволяет создавать специализированные подклассы, которые удерживают определенное количество аргументов (например,
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) |
Возвращает аргумент по индексу |