Linee di interpolazione di stringhe lunghe in C # 6


134

Ho scoperto che mentre l'interpolazione di stringhe è davvero piacevole se applicata alle chiamate di formato stringa della mia base di codice esistente, dato il limite di colonna generalmente preferito, la stringa diventa rapidamente troppo lunga per una singola riga. Soprattutto quando le espressioni interpolate sono complesse. Con una stringa di formato hai un elenco di variabili che puoi dividere in più righe.

var str = string.Format("some text {0} more text {1}",
    obj1.property,
    obj2.property);

Qualcuno ha qualche mezzo preferito per spezzare queste linee?

Suppongo che potresti fare qualcosa del tipo:

var str = $"some text { obj1.property }" +
  " more text { obj2.property };

1
Nella mia esperienza è meglio evitare di interpolare espressioni complesse. Piuttosto estrarre una variabile in quel caso. Se lo fai, e ti interrompi dove ci sono nuove linee all'interno delle tue stringhe, in genere andrà bene.
markijbema,

2
Sono confuso da questa domanda. Voglio solo una multilinea $""che funzioni come@""
colonnello Panic

2
Colonnello Panic, la domanda è: come spezzare le lunghe linee di interpolazione in modo da non violare i requisiti di larghezza della colonna, senza introdurre avanzamenti di riga nello stesso valore letterale della stringa. $ @ "" è fantastico, ma qualsiasi nuova riga introdotta sarà letterale.
Jeremiah Gowdy,

4
Pericolo: $"some text { obj1.property }" + " more text { obj2.property }";non fa quello che sembra pensare che faccia. Solo la prima metà di quell'espressione è una stringa interpolata; viene quindi concatenato con la stringa letterale non interpolata" more text { obj2.property }"
bacar

1
Per supportare \ t \ r \ n in $ @ vedere la domanda stackoverflow.com/questions/51991713/...
M.Hassan

Risposte:


198

È possibile rompere la linea in più righe, ma non direi che il bel aspetto di sintassi più.

È necessario utilizzare la $@sintassi per utilizzare una stringa testuale interpolata e è possibile inserire nuove righe all'interno dei {...}parametri, in questo modo:

string s = $@"This is all {
    10
    } going to be one long {
    DateTime.Now
    } line.";

La stringa sopra non conterrà alcuna nuova riga e in realtà avrà contenuti come questo:

Tutto questo sarà una linea lunga 01.08.2015 23.49.47.

(nota, formato norvegese)

Ora, detto questo, non smetterei di usare string.Format. Secondo me alcune di queste espressioni di interpolazione di stringhe sembrano davvero buone, ma quelle più complesse iniziano a diventare molto difficili da leggere. Considerando che, a meno che non si utilizzi FormattableString, il codice verrà compilato in una chiamata in String.Formatogni caso, direi di andare avanti String.Formatdove ha senso.


Risposta solida. Sono abbastanza sicuro che FormattableStringsi riduce anche a una chiamata a String.Format.
Alex Booker,

8
Questa risposta mi ha aiutato a capire come fare l'esatto contrario di questo. Grazie per la $@""sintassi!
Bobson,

@AlexBooker È più complesso di così. Non puoi farlo FormattableString.Invarian($"Hello {name}" + \n "are you the owner of {pet}?");perché unisce le due stringhe interpolate in una singola stringa semplice.
ANeves

Newline e tab sono rispettati in stringhe interpolate. Immettere quanto segue nella finestra interattiva C # e la stringa risultante verrà formattata :. > var name = "Simon"; var templateName = "How to interpolate a verbatim string"; var now = DateTime.UtcNow;. var output = $@"Hi {name}, This template is a demo of {templateName}. It was ran at {now.ToString("o")}"; > output. L'output è"Hi Simon,\r\nThis template is a demo of How to interpolate a verbatim string.\r\n\r\nIt was ran at 2020-01-24T15:49:35.6678353Z"
Enzoaeneas il

1
@Enzoaeneas Penso che tu abbia sopravvalutato il supporto di formattazione nei commenti, ma capisco e sono d'accordo con quello che stai dicendo.
Lasse V. Karlsen,

61

È possibile combinare $e @insieme per ottenere l'interpolazione delle stringhe e il valore letterale delle stringhe multilinea:

var str = $@"some text { obj1.property }
     more text { obj2.property }";

Ma questo ti darà un NewLinepersonaggio nel mezzo, quindi potrebbe non essere quello che vuoi.


3
Ma @ non inserisce effettivamente il feed della riga in letterale?
Jeremiah Gowdy,

5
Lo fa. Aggiornato la mia risposta per dirlo esplicitamente.
MarcinJuraszek,

Non solo una nuova riga, ma anche le schede iniziali della nuova riga. Per rappresentare correttamente il formato stringa effettivo quando si utilizza $@"Visual Studio, è necessario iniziare ogni nuova riga dall'estrema sinistra dell'editor di testo.
GDS,

Con questa soluzione non puoi usare eg \ r e \ n nella stringa
Johan Franzén

22

Mentre OP ha chiesto qualcos'altro, mi aspetto che molte persone che leggono questa domanda vorrebbero un'interpolazione multilinea $""che funzioni come @"". Per farlo, usa$@""

$@"Height: {height}
Width: {width}
Background: {background}"

3
Non vuole nuove righe nell'output, ma solo il codice stesso da racchiudere in righe diverse
Martin Capodici

7
Ha chiarito che questa risposta era destinata al pubblico che arriva alla ricerca di come eseguire stringhe multilinea utilizzando la sintassi di interpolazione delle stringhe.
Brandon Bonds,

2

Questo è:

var str = $"some text { obj1.property }" +
          $" more text { obj2.property }";

Nota il secondo $nel$"..." + $"..."


18
Nota che questo farà due chiamate a String.Format e creerà anche tre stringhe in memoria (Lato A, Lato B e A + B)
Kevin Kalitowski,

1
Questo non ti impedirebbe di usare un FormattableStringcast sulla stringa concatenata?
binki,

4
Oggi in molte implementazioni, l'esecuzione su una CPU GHz con memoria Gb, una chiamata aggiuntiva e una stringa aggiuntiva non ti daranno problemi di prestazioni. I problemi di prestazione saranno causati, ad esempio, dall'uso di un algoritmo di O (n2). Penso che sia ingiusto sottovalutare questo ragazzo.
Johan Franzén,

1

Ho usato StringBuilder all'interno di ToString () sovrascritto come esempio.

    // return employee data
    public override string ToString()
    {
        StringBuilder buffer = new StringBuilder();
        buffer.AppendLine($"Number: {EmployeeNumber}");
        buffer.AppendLine($"Name: {EmployeeName}");
        buffer.AppendLine($"Address: {PostalAddress}");
        buffer.AppendLine($"Phone: {PhoneNumber}");
        buffer.AppendLine($"Age: {EmployeeAge}");
        buffer.AppendLine($"Gender: {EmployeeGender}");
        buffer.AppendLine($"Status: {EmployeeStatus}");
        buffer.AppendLine($"Manager: {EmployeeManager}");
        buffer.AppendLine($"Start: {EmployeeStartDate.ToShortDateString()}");
        return buffer.ToString();
    }

allora perché no buffer.AppendFormat("{0}Number: {1}", Environment.NewLine, EmployeeNumber);???
TS
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.