IArgumentProvider Gränssnitt

Definition

Tillhandahåller ett internt gränssnitt för åtkomst till argumenten för flera trädnoder (DynamicExpression, ElementInit, MethodCallExpression, InvocationExpression, NewExpression och IndexExpression). Det här API:et är endast för internt bruk.

public interface class IArgumentProvider
public interface IArgumentProvider
type IArgumentProvider = interface
Public Interface IArgumentProvider
Härledda

Kommentarer

Du bör inte använda det här API:et. Den är endast offentlig på grund av sammansättningsrefaktorisering och finns endast för interna prestandaoptimeringar. Det möjliggör två optimeringar som minskar trädens storlek:

  1. Det gör att noderna kan hålla fast vid en IList<T> i stället för en ReadOnlyCollection<T>. Detta sparar kostnaden för att allokera den skrivskyddade samlingen för varje nod.

  2. Det gör det möjligt att skapa specialiserade underklasser som håller fast vid ett visst antal argument (till exempel Block2, Block2, ). Block4 Därför undviker dessa noder att allokera både en ReadOnlyCollection<T> och en matris för att lagra sina element, vilket sparar 32 byte per nod. Den här tekniken används av olika noder, inklusive BlockExpression, InvocationExpressionoch MethodCallExpression.

Uttrycksträdnoderna fortsätter att exponera de ursprungliga LINQ-egenskaperna för ReadOnlyCollection<T> objekt. De gör detta genom att återanvända ett fält för lagring av både matrisen eller ett element som normalt skulle lagras i matrisen.

För matrisfallet skrivs samlingen till i stället för IList<T>ReadOnlyCollection<T>. När noden först konstrueras är det en matris. Kompilatorn eller verktygen i det här biblioteket kommer åt elementen via det här gränssnittet. Åtkomst till matriselement höjer matrisen till en ReadOnlyCollection<T>.

För objektfallet lagras det första argumentet i ett fält som skrivs till Object. När noden först konstrueras innehåller det här fältet det Expression första argumentet. När kompilatorn och verktygen i det här biblioteket kommer åt argumenten använder de återigen det här gränssnittet, och accessorn för det första argumentet använder den interna Expression.ReturnObject<T>(System.Object) hjälpmetoden för att returnera det objekt som hanterar Expression eller-fallet ReadOnlyCollection<T> . När användaren kommer ReadOnlyCollection<T>åt , uppdateras objektfältet för att hålla direkt på ReadOnlyCollection<T>.

Det är viktigt att Expression egenskaperna konsekvent returnerar samma ReadOnlyCollection<T>. Annars kommer den omskrivningsträdvandrare som används av uttrycksbesökare att bryta. Det är en icke-bakåtkompatibel ändring från LINQ v1 att returnera en annan ReadOnlyCollection<T> än samma Expression nod. För närvarande kan användare förlita sig på objektidentitet för att se om noden har ändrats. Att ReadOnlyCollection<T> lagra i ett överbelastat fält minskar både minnesanvändningen och bibehåller kompatibiliteten för det offentliga API:et.

Egenskaper

Name Description
ArgumentCount

Returnerar antalet argument till uttrycksträdnoden. Det här API:et är endast för internt bruk.

Metoder

Name Description
GetArgument(Int32)

Returnerar argumentet vid indexoch utlöser om index är utanför gränserna. Det här API:et är endast för internt bruk.

Gäller för