2015-10-20 19 views
24

C# 6 porta il supporto compilatore per stringhe interpolate con la sintassi:multilinea C# interpolato stringa letterale

var person = new { Name = "Bob" }; 

string s = $"Hello, {person.Name}."; 

Questo è grande per stringhe brevi, ma se si vuole produrre una stringa più lunga deve si essere specificata su una sola linea?

Con altri tipi di stringhe è possibile:

var multi1 = string.Format(@"Height: {0} 
Width: {1} 
Background: {2}", 
     height, 
     width, 
     background); 

Oppure:

var multi2 = string.Format(
    "Height: {1}{0}" + 
    "Width: {2}{0}" + 
    "Background: {3}", 
    Environment.NewLine, 
    height, 
    width, 
    background); 

non riesco a trovare un modo per raggiungere questo obiettivo con interpolazione stringa senza avere tutto una sola riga:

var multi3 = $"Height: {height}{Environment.NewLine}Width: {width}{Environment.NewLine}Background: {background}"; 

Mi rendo conto che in questo caso è possibile utilizzare \r\n al posto di Environment.NewLine (meno portabile) o estraetelo a un locale, ma ci saranno casi in cui non è possibile ridurlo sotto una linea senza perdere forza semantica.

È semplicemente il caso che l'interpolazione delle stringhe non debba essere utilizzata per stringhe lunghe?

Dovremmo semplicemente usare stringhe usando StringBuilder per stringhe più lunghe?

var multi4 = new StringBuilder() 
    .AppendFormat("Width: {0}", width).AppendLine() 
    .AppendFormat("Height: {0}", height).AppendLine() 
    .AppendFormat("Background: {0}", background).AppendLine() 
    .ToString(); 

Oppure c'è qualcosa di più elegante?

+6

http://stackoverflow.com/questions/31764898/long-string-interpolation-lines-in-c6 – Ric

+0

@DmytroShevchenko, ho pensato di farlo. Tuttavia non ero sicuro di accettare il tuo mentre ti guardavo copiare/incollare la [risposta più votata] (http://stackoverflow.com/a/31764920/24874) dal link che Ric ha pubblicato, quindi modificarlo per apparire diverso . Tutto è successo entro 5 minuti, quindi le modifiche non sono visibili. La tua risposta è tecnicamente corretta, ma sentivo che dovresti aver dato credito. In realtà vorrei accettare il commento di Ric, ma non è possibile. –

+0

@DrewNoakes la tua domanda è stata contrassegnata come un duplicato della domanda collegata da Ric. Anche Ric lo ha segnato. Quindi non c'è bisogno di aggiungere un'altra istanza di quel collegamento alla mia risposta. Se non sei d'accordo, apprezzerei il tuo ragionamento. E naturalmente ho modificato il codice nella mia risposta. Anche se, la ragione non era quella di farlo sembrare diverso, ma piuttosto di corrispondere all'esempio nella tua domanda. –

risposta

49

È possibile combinare $ e @ stringa insieme per ottenere una multilinea interpolato letterale:

string s = 
[email protected]"Height: {height} 
Width: {width} 
Background: {background}"; 

Fonte: Long string interpolation lines in C#6 (Grazie a @Ric per trovare il filo!)

+1

L'ho provato come @ $ (invertito) e non ha funzionato, quindi ho pensato che non potevano essere combinati. Non mi è venuto in mente di provarlo nell'altro modo. – kencordero

2

probabilmente userei una combinazione

var builder = new StringBuilder() 
    .AppendLine($"Width: {width}") 
    .AppendLine($"Height: {height}") 
    .AppendLine($"Background: {background}"); 
+0

il down-voter può fornire qualche informazione? Non vedo alcun problema con questo, c'è un problema? – kai

+0

Per la cronaca, ti ho davvero revocato. Ci possono essere casi in cui questo è più leggibile. L'unico aspetto negativo a cui riesco a pensare è che sta creando alcuni oggetti extra per il GC. –

+0

Penso che sia solo un aspetto negativo in casi eccezionali in cui si hanno risorse molto limitate o è necessario aggiungere migliaia, se non milioni di righe. Non mi piacciono particolarmente le stringhe letterali per la formattazione. Rende il layout del testo nel file di codice responsabile dell'aspetto dell'output. Preferisco il costruttore di stringhe, è più espressivo. – kai

0

Personalmente, ho appena aggiunto un'altra stringa interpolata usando strin g concatenazione

Per esempio

var multi = $"Height  : {height}{Environment.NewLine}" + 
      $"Width  : {width}{Environment.NewLine}" + 
      $"Background : {background}"; 

trovo che è più facile da formattare e leggere.

Questo avrà un overhead aggiuntivo rispetto all'utilizzo di $ @ "", ma solo nelle applicazioni più critiche per le prestazioni questo risulterà evidente. Nella memoria le operazioni con le stringhe sono estremamente economiche rispetto all'I/O dei dati. Leggere una singola variabile dal db richiederà centinaia di volte più a lungo nella maggior parte dei casi.

Problemi correlati