Interpolazione di stringhe vs String.Format


114

C'è una notevole differenza di prestazioni tra l'utilizzo dell'interpolazione di stringhe:

myString += $"{x:x2}";

vs String.Format ()?

myString += String.Format("{0:x2}", x);

Chiedo solo perché Resharper sta richiedendo la correzione e sono stato ingannato prima.


4
Perché non provarli entrambi e vedere se noti la differenza?
Blorgbeard uscirà il

57
@Blorgbeard Onestamente, sono pigro. E immagino che ci vorrebbe meno tempo se uno di voi uomini / donne onesti conoscesse la risposta immediatamente.
Krythic

26
Adoro come quando ho posto questa domanda per la prima volta, è stata votata all'oblio e ora, due anni dopo, tocca a +21.
Krythic

47
Sul serio. Come si può dubitare dell'utilità di questa domanda? Riuscite a immaginare il totale spreco di ore di lavoro, se tutti coloro che fanno questa domanda dovessero "provarlo e vedere?" Anche se ci sono voluti solo 5 minuti, moltiplicalo per gli oltre 10.000 sviluppatori che hanno visualizzato questa domanda finora. E poi cosa fai quando un collega dubita dei tuoi risultati? Rifallo da capo? O forse rimandali a questo post SO. Questo è più o meno quello che serve.
BTownTKD

8
@BTownTKD Questo è il tipico comportamento di Stackoverflow per te. Se qualcuno utilizza il sito per lo scopo previsto, viene immediatamente alienato. Questo è anche uno dei motivi per cui penso che dovremmo essere autorizzati a vietare collettivamente gli account. Molte persone semplicemente non meritano di essere su questo sito.
Krythic

Risposte:


72

Notevole è relativo. Tuttavia: l'interpolazione delle stringhe viene trasformata in string.Format()fase di compilazione, quindi dovrebbero avere lo stesso risultato.

Ci sono però sottili differenze: come possiamo dedurre da questa domanda, la concatenazione di stringhe nell'identificatore di formato risulta in una string.Concat()chiamata aggiuntiva .


4
In realtà, l'interpolazione di stringhe potrebbe compilarsi in concatenazione di stringhe in alcuni casi (ad esempio quando intsi usa a). var a = "hello"; var b = $"{a} world";compila per concatenazione di stringhe. var a = "hello"; var b = $"{a} world {1}";viene compilato in formato stringa.
Omar Muscatello

5

l'interpolazione di stringhe viene trasformata in string.Format () in fase di compilazione.

Anche in string.Format è possibile specificare diversi output per un singolo argomento e diversi formati di output per un singolo argomento. Ma l'interpolazione di stringhe è più leggibile immagino. Quindi, dipende da te.

a = string.Format("Due date is {0:M/d/yy} at {0:h:mm}", someComplexObject.someObject.someProperty);

b = $"Due date is {someComplexObject.someObject.someProperty:M/d/yy} at {someComplexObject.someObject.someProperty:h:mm}";

Ci sono alcuni risultati dei test delle prestazioni https://koukia.ca/string-interpolation-vs-string-format-string-concat-and-string-builder-performance-benchmarks-c1dad38032a


2
l'interpolazione di stringhe viene talvolta trasformata in String::Format. e talvolta in String::Concat. E il test delle prestazioni su quella pagina non è veramente significativo: la quantità di argomenti che passi a ciascuno di questi metodi dipende. concat non è sempre il più veloce, stringbuilder non è sempre il più lento.
Matthias Burger

3

La domanda riguardava le prestazioni, tuttavia il titolo dice solo "vs", quindi mi sento come se dovessi aggiungere qualche punto in più, alcuni dei quali sono supponenti.

  • Localizzazione

    • L'interpolazione di stringhe non può essere localizzata a causa della sua natura di codice inline. Prima della localizzazione deve essere trasformato in string.Format. Tuttavia, ci sono strumenti per questo (ad esempio ReSharper).
  • Manutenibilità (la mia opinione)

    • string.Formatè molto più leggibile, poiché si concentra sulla frase ciò che vorrei formulare, ad esempio quando costruisco un messaggio di errore carino e significativo. L'utilizzo dei {N}segnaposto mi offre maggiore flessibilità ed è più facile modificarlo in seguito.
    • Inoltre, l'identificatore di formato inline nell'interploation è facile da interpretare erroneamente e facile da eliminare insieme all'espressione durante una modifica.
    • Quando si usano espressioni complesse e lunghe, l'interpolazione diventa rapidamente ancora più difficile da leggere e mantenere, quindi in questo senso non si adatta bene quando il codice si evolve e diventa più complesso. string.Formatè molto meno incline a questo.
    • Alla fine della giornata è tutta una questione di separazione delle preoccupazioni: non mi piace mescolare il modo in cui dovrebbe presentarsi con ciò che dovrebbe essere presentato .

Quindi, sulla base di questi, ho deciso di restare string.Formatnella maggior parte del mio codice. Tuttavia, ho preparato un metodo di estensione per avere un modo più scorrevole di codificare che mi piace molto di più. L'implementazione dell'estensione è di una riga e sembra semplicemente così in uso.

var myErrorMessage = "Value must be less than {0:0.00} for field {1}".FormatWith(maximum, fieldName);

L'interpolazione è un'ottima funzionalità, non fraintendermi. Ma IMO brilla al meglio in quelle lingue che mancano della string.Formatfunzionalità simile, ad esempio JavaScript.


Grazie per aver aggiunto a questo.
Krythic

1
Non sono d'accordo sulla manutenibilità; concesso ReSharper rende un po 'più facile abbinare i valori inseriti con i loro indici corrispondenti (e viceversa) ma penso che sia ancora più carico cognitivo capire se {3}è X o Y soprattutto se inizi a riorganizzare il tuo formato. Esempio di Madlibs: $"It was a {adjective} day in {month} when I {didSomething}"vs string.Format("It was a {0} day in {1} when I {2}", adjective, month, didSomething)-> $"I {didSomething} on a {adjective} {month} day"vsstring.Format("I {2} on a {0} {1} day", adjective, month, didSomething)
drzaus il

@drzaus Grazie per aver condiviso i tuoi pensieri. Hai buoni punti, tuttavia è vero solo se usiamo solo variabili locali semplici e ben denominate. Quello che ho visto molte volte sono espressioni complesse, chiamate di funzioni, qualsiasi cosa inserita in una stringa interpolata. Con string.Formatpenso che tu sia molto meno incline a questo problema. Ma comunque, questo è il motivo per cui ho sottolineato che è la mia opinione :)
Zoltán Tamási
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.