IArgumentProvider Interfaz
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
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:
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.
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 |