2009-10-14 15 views
27

Esiste un modo decente per dichiarare una stringa lunga singola riga in C#, in modo che non sia impossibile dichiarare e/o visualizzare la stringa in un editor?Dichiarazione di una stringa di linea singola looooong in C#

Le opzioni io sappia sono:

1: Lasciar correre. Questo è un problema perché la tua stringa si dirige a destra dello schermo, facendo in modo che uno sviluppatore che legge il messaggio debba scansionare e leggere.

string s = "this is my really long string. this is my really long string. this is my really long string. this is my really long string. this is my really long string. this is my really long string. this is my really long string. this is my really long string. "; 

2: @ + newlines. Questo sembra bello nel codice, ma introduce una nuova riga nella stringa. Inoltre, se vuoi che appaia bello nel codice, non solo ottieni le nuove linee, ma ottieni anche spazi scomodi all'inizio di ogni riga della stringa.

string s = @"this is my really long string. this is my long string. 
      this line will be indented way too much in the UI. 
This line looks silly in code. All of them suffer from newlines in the UI."; 

3: "" + ... Questo funziona bene, ma è super frustrante digitare. Se devo aggiungere da qualche parte il testo di una riga, devo aggiornare tutti i tipi di + e spostare tutto il testo.

string s = "this is my really long string. this is my long string. " + 
      "this will actually show up properly in the UI and looks " + 
      "pretty good in the editor, but is just a pain to type out " + 
      "and maintain"; 

4: string.format or string.concat. Sostanzialmente come sopra, ma senza i segni più. Ha gli stessi vantaggi e svantaggi.

Non c'è davvero un modo per farlo bene?

risposta

7

Dipende da come verrà utilizzata la stringa. Tutte le risposte qui sono valide, ma il contesto è importante. Se lunga serie "s" sta per essere registrato, deve essere circondato con un test guardia di registrazione, come ad esempio questo esempio Log4net:

if (log.IsDebug) { 
    string s = "blah blah blah" + 
    // whatever concatenation you think looks the best can be used here, 
    // since it's guarded... 
} 

Se la stringa lunga s sta per essere visualizzato a un utente, quindi La risposta dello sviluppatore Art è la scelta migliore ... quelle dovrebbero essere nel file di risorse.

Per altri usi (generazione di stringhe di query SQL, la scrittura ai file [ma prendere in considerazione le risorse ancora per questi], ecc ...), dove si sono concatenazione di più di un semplice letterali, considerare StringBuilder come suggerisce Wael Dalloul, in particolare se la tua stringa potrebbe finire in una funzione che potrebbe, in una data futura, essere chiamata molte volte in un'applicazione time-critical (tutte queste chiamate si sommano). Lo faccio, ad esempio, quando costruisco una query SQL in cui ho parametri che sono variabili.

Diverso da quello, no, non conosco nulla che sia bello ed è facile da scrivere (anche se la parola wrap suggerimento è una buona idea, potrebbe non tradursi bene in strumenti diff, code printout, o strumenti di revisione del codice). Quelle sono le pause. (Personalmente utilizzo l'approccio plus-sign per rendere le line-wrap ordinate per le nostre stampe e revisioni del codice).

+3

La concatenazione di stringhe letterali è gestita dal compilatore C#, quindi non c'è zero sovraccarico in fase di esecuzione per l'utilizzo di una stringa dichiarata come '" x "+" y "+" Z "+ ...' –

+0

Ah, @ 280Z28 è ovviamente corretto! Ho aggiunto alcuni chiarimenti su quando utilizzare l'approccio StringBuilder (quando hai variabili mescolate con le tue ltierali). –

59

C'è un modo. Metti la tua stringa molto lunga in risorse. Puoi persino inserire lunghe porzioni di testo perché è dove dovrebbero essere i testi. Avere loro direttamente nel codice è una vera cattiva pratica.

+6

mi piace cambiare il mio schema di colori VS in modo che le stringhe appaiono in qualche colore orrendo. Mi ricorda sempre che sta succedendo qualcosa di brutto. – DavidGouge

+0

Cattiva pratica sì, ma non sempre risolvibile nei software legacy (dove il project manager non ha visto la luce). – stevehipwell

+1

@ Stevo3000: credo che l'autore della domanda sia in grado di risolverlo. Ecco perché chiede un consiglio. –

-1

Potreste usare StringBuilder

8

Se si utilizza Visual Studio

Tools > Options > Text Editor > All Languages > Word Wrap 

Sono sicuro che qualsiasi altro editor di testo (compresi notepad) sarà in grado di fare questo!

+0

Mi piace questa opzione per il codice, ma non per stringhe enormi come questa – MartW

+0

@CodeByMoonlight - Che cos'è una lunga stringa nel codice sorgente ma codice?Non sto dicendo che sia l'aproach giusto, ma fa quello che dice sulla latta! Personalmente conserverei le stringhe come una risorsa! – stevehipwell

+0

Io uso costantemente questa opzione, mi sento in errore per le stringhe lunghe che potrebbero coprire diversi schermi. L'opzione di risorsa è migliore, come è stato detto. – MartW

0

O lo lascio girare, o uso string.format e scrivere la stringa in una riga (il metodo lasci eseguire) ma inserire ciascuno degli argomenti in una nuova riga, il che rende sia più facile da leggere, sia a Almeno dai al lettore un'idea di cosa può aspettarsi nella lunga stringa senza leggerlo in dettaglio.

+0

In alternativa, spezza la stringa molto lunga e usa 'string.Concat' per unire i pezzi. Questo evita l'eccessivo '+' -nessità del lato destro :-) – Joey

6

Deve essere definito nel file sorgente? Altrimenti, definirlo in una risorsa o in un file di configurazione.

5

è possibile utilizzare StringBuilder come questo:

StringBuilder str = new StringBuilder(); 
str.Append("this is my really long string. this is my long string. "); 
str.Append("this is my really long string. this is my long string. "); 
str.Append("this is my really long string. this is my long string. "); 
str.Append("this is my really long string. this is my long string. "); 
string s = str.ToString(); 

È anche possibile utilizzare: file di testo, file di risorse, di database e di registro.

+0

Non so perché questa risposta è stata valutata così bassa. Ha un codice di esempio, e l'uso di StringBuilder è una buona pratica, in quanto su molte concatenazioni è più efficiente. –

+0

Perché in questa situazione aggiunge solo inutili complicazioni. – MartW

+0

Non sono sicuro che ci sia abbastanza contesto nella domanda per determinare la situazione. Si tratta di un messaggio one-off all'avvio dell'applicazione? O è un messaggio di log in un metodo chiamato 100 volte al secondo? In tal caso, le prestazioni contano. Misurazioni delle prestazioni effettive di riferimento: http://blog.briandicroce.com/2008/02/04/stringbuilder-vs-string-performance-in-net/ –

3

Personalmente vorrei leggere una stringa così grande da un file, forse un documento XML.

2

Per stringhe molto lunghe, lo memorizzerei in XML (o in una risorsa). Per le occasioni in cui ha senso averlo nel codice, io uso la concatenazione di stringhe multilinea con l'operatore +. L'unico posto in cui posso pensare a dove lo faccio, però, è nei miei test unitari per il codice che legge e analizza l'XML dove sto cercando di evitare l'uso di un file XML per il test. Dal momento che si tratta di un test unitario, quasi sempre desidero avere la stringa giusta per fare riferimento anche a questo. In questi casi potrei separarli tutti in una direttiva #region in modo da poterli mostrare/nascondere come necessario.

0

se davvero hai bisogno di tenerlo nel codice allora che ne dici di @ + newlines e poi una semplice funzione per rimuovere le newline.

4

Se si in realtà desidera questa lunga stringa nel codice e non si desidera digitare la virgolette-plus-begin-quote, quindi è possibile provare qualcosa di simile.

string longString = @"Some long string, 
    with multiple whitespace characters 
    (including newlines and carriage returns) 
    converted to a single space 
    by a regular expression replace."; 

longString = Regex.Replace(longString, @"\s+", " "); 
0

Utilizzare Project/Properties/Settings dal menu principale di Visual Studio. Crea il scope = "Application".

Nella casella Valore è possibile inserire stringhe molto lunghe e vengono conservati feed di linee bonus. Allora il tuo codice può fare riferimento a quella stringa come questa:

string sql = Properties.Settings.Default.xxxxxxxxxxxxx;

Problemi correlati