IArgumentProvider Interfaz

Definición

Proporciona una interfaz interna para acceder a los argumentos de varios nodos de árbol (DynamicExpression, ElementInit, MethodCallExpression, InvocationExpression, NewExpression e IndexExpression). Esta API es solo para uso interno.

public interface class IArgumentProvider
public interface IArgumentProvider
type IArgumentProvider = interface
Public Interface IArgumentProvider
Derivado

Comentarios

Esta API no debe usarse. Solo es público debido a la refactorización de ensamblados y solo existe para las optimizaciones de rendimiento internas. Permite dos optimizaciones que reducen el tamaño de los árboles:

  1. Permite que los nodos se contengan en IList<T> en lugar de en .ReadOnlyCollection<T> Esto ahorra el costo de asignar la colección de solo lectura para cada nodo.

  2. Permite crear subclases especializadas que contengan un número específico de argumentos (por ejemplo, Block2, Block2, Block4). Por lo tanto, estos nodos evitan asignar una ReadOnlyCollection<T> matriz y para almacenar sus elementos, lo que ahorra 32 bytes por nodo. Esta técnica la usan varios nodos, incluidos BlockExpression, InvocationExpressiony MethodCallExpression.

Los nodos del árbol de expresión continúan exponiendo las propiedades LINQ originales de ReadOnlyCollection<T> los objetos. Para ello, reutilizan un campo para almacenar la matriz o un elemento que normalmente se almacenaría en la matriz.

En el caso de la matriz, la colección se escribe IList<T> en en lugar de ReadOnlyCollection<T>en . Cuando se construye inicialmente el nodo, es una matriz. El compilador o las utilidades de esta biblioteca acceden a los elementos a través de esta interfaz. El acceso a los elementos de matriz promueve la matriz a .ReadOnlyCollection<T>

Para el caso del objeto, el primer argumento se almacena en un campo escrito Objecten . Cuando se construye inicialmente el nodo, este campo contiene el Expression del primer argumento. Cuando el compilador y las utilidades de esta biblioteca acceden a los argumentos, vuelven a usar esta interfaz y el descriptor de acceso para el primer argumento usa el método auxiliar interno Expression.ReturnObject<T>(System.Object) para devolver el objeto que controla el Expression caso o ReadOnlyCollection<T> . Cuando el usuario tiene acceso a ReadOnlyCollection<T>, el campo de objeto se actualiza para almacenarlo directamente en .ReadOnlyCollection<T>

Es importante que Expression las propiedades devuelvan de forma coherente el mismo ReadOnlyCollection<T>. De lo contrario, el caminador de árbol de reescritura usado por los visitantes de expresiones se interrumpirá. Se trata de un cambio importante de LINQ v1 para devolver diferente ReadOnlyCollection<T> del mismo Expression nodo. Actualmente, los usuarios pueden confiar en la identidad del objeto para indicar si el nodo ha cambiado. Almacenar en ReadOnlyCollection<T> un campo sobrecargado reduce el uso de memoria y mantiene la compatibilidad con la API pública.

Propiedades

ArgumentCount

Devuelve el número de argumentos al nodo de árbol de expresión. Esta API es solo para uso interno.

Métodos

GetArgument(Int32)

Devuelve el argumento en index, y se iniciará una excepción si index está fuera de los límites. Esta API es solo para uso interno.

Se aplica a