2015-07-11 10 views
8

Breve e semplice. La nuova interpolazione della stringa in C# 6.0 si basa sulla riflessione? Cioè nonL'interpolazione di stringa di C# 6.0 si basa su Reflection?

string myStr = $"Hi {name}, how are you?"; 

uso riflessione in fase di esecuzione per trovare il "nome" variabile e il suo valore?

+5

Perché sarebbe necessario? Il compilatore ha tutte le informazioni di cui ha bisogno. Se il nome della variabile 'name' è in ambito, verrà utilizzato, altrimenti si verificherà un errore. –

+1

Non lo so, è per questo che ho chiesto. Non ero sicuro se la stringa di formato fosse salvata "così com'è" nel file binario e quindi riempire gli spazi vuoti (nel caso classico {0}, ecc. Con le variabili). Se così fosse, allora dovrebbe usare la riflessione, ma non so come queste istruzioni siano gestite dal compilatore – Xaser

+1

Non lo so, ma di sicuro darei un'occhiata a un decompilatore come dotPeek per vedere cosa sta succedendo –

risposta

18

No. Non è così. È completamente basato sulla valutazione in fase di compilazione.

Si può vedere che con questo TryRoslyn example che compila e decompila questo:

int name = 4; 
string myStr = $"Hi {name}, how are you?"; 

In questa:

int num = 4; 
string.Format("Hi {0}, how are you?", num); 

stringa di interpolazione supporta anche utilizzando IFormattable come il risultato in modo (again using TryRoslyn) this:

int name = 4; 
IFormattable myStr = $"Hi {name}, how are you?"; 

si trasforma in questo:

int num = 4; 
FormattableStringFactory.Create("Hi {0}, how are you?", new object[] { num }); 
+1

Grazie! Stavo per chiedere se è completamente equivalente a un String.Format ma questo Esempio di TryRoslyn ha reso tutto più chiaro :) accetterà al più presto. – Xaser

+0

@ i3arnon, ero sorpreso che '$" Ciao {0}, come stai? ";' Compilato e metti '0' come argomento per' stringa.Formato'. È ovvio perché il compilatore ti permette di inserire il codice all'interno: '$" Ciao {friend.GiveMeYourName()}, come stai? ";'. Ma ragionare dietro la capacità di mettere i numeri è molto interessante. –

+1

@LeonidVasilyev perché? È solo un'espressione. Perché il compilatore dovrebbe agire diversamente? Sarebbe una riga di codice interessante da scrivere, ma il compilatore dovrebbe permetterti di scriverlo. – i3arnon

3

This article spiega che è in fase di compilazione base (che internamente chiama string.Format(). Un preventivo:

L'interpolazione stringa viene trasformata in fase di compilazione per richiamare una stringa equivalente. Chiamata formattata. Questo lascia il supporto per la localizzazione come prima (anche se ancora con le stringhe in formato composito) e non introduce alcuna iniezione di codice post-compilazione tramite stringhe.

Problemi correlati