Compiled Expression Trees Missverständnis?

8

Ich habe diesen Ausdruck:

%Vor%

%Vor%

// lässt: test

%Vor%

Ich möchte nach dem .Compile()

fragen

Was kompiliert es? Und was ist der Unterschied zwischen der ersten Ausführung und späteren Ausführungen ...?

Kompilieren sollte etwas sein, was einmal passiert und später nicht mehr passiert ....

Was / Wie hilft es mir?

    
Royi Namir 26.02.2012, 13:07
quelle

3 Antworten

9

Wenn Sie den Ausdrucksbaum zur Laufzeit erstellen, wird kein Code ausgegeben. Es ist eine Möglichkeit, .NET-Code zur Laufzeit darzustellen.

Sobald Sie die Methode .Compile in der Ausdrucksbaumstruktur aufrufen, wird der eigentliche IL-Code ausgegeben, um diese Ausdrucksbaumstruktur in einen Delegaten ( Func<string, bool> in Ihrem Fall) umzuwandeln, den Sie zur Laufzeit aufrufen können. Der Code, den dieser Ausdrucksbaum darstellt, kann also erst nach dem Kompilieren ausgeführt werden.

Calling Compile ist eine teure Operation. Grundsätzlich sollten Sie es einmal aufrufen und dann den resultierenden Delegaten zwischenspeichern, mit dem Sie den Code mehrmals aufrufen können.

    
Darin Dimitrov 26.02.2012, 13:18
quelle
2

Expression<Func<string,bool>> ist nur eine Repräsentation eines Ausdrucks, es kann nicht ausgeführt werden . Der Aufruf von Compile() gibt Ihnen einen kompilierten Delegaten, ein Stück Code, den Sie aufrufen können. Im Wesentlichen erstellt Ihr Programm ein kleines Code-Snippet zur Laufzeit und ruft es dann so auf, als wäre es vom Compiler verarbeitet worden. Dies ist, was die letzten zwei Zeilen Ihres Codes tun: Wie Sie sehen können, kann das kompilierte Snippet die Länge der Zeichenfolge analysieren, die Sie übergeben - wenn die Länge weniger als fünf ist, erhalten Sie True zurück; Wenn es fünf oder mehr ist, erhalten Sie False .

Was bei der ersten Ausführung des kompilierten Snippets passiert, ist plattformabhängig und sollte für Programmierer, die die .NET-Plattform verwenden, nicht erkennbar sein.

    
dasblinkenlight 26.02.2012 13:19
quelle
2

Compile() verwendet den Ausdrucksbaum (der eine Datendarstellung einer Logik darstellt) und konvertiert es in IL, die dann direkt als Delegat ausgeführt werden kann.

Der einzige Unterschied zwischen der ersten Ausführung und späteren Ausführungen besteht in der Möglichkeit, dass Compile() die JIT-Kompilierung von IL auf nativen Prozessorcode nicht auslöst. Das kann bei der ersten Ausführung passieren.

    
Jon Skeet 26.02.2012 13:19
quelle

Tags und Links