2009-11-05 16 views
6

Il compilatore ottimizzerà le stringhe piuttosto formattate o il codice verrà eseguito più lentamente delle stringhe che non sono divise in modo leggibile?Pretty format sql in codice .NET, prestazioni?

ad esempio

string sql = 
    "select * " + 
    "from person " + 
    "where id = :id"; 

o

string sql = "select * from person where id = :id"; 

Questo è solo un piccolo esempio. Sai quanto può essere complicato lo sql.

+3

Il compilatore ottimizza senza dubbio la stringa quando si compila il programma in modo che sia uguale nel codice eseguito. – Lazarus

+2

Perché stai inviando risposte come commenti? –

+0

Possibile duplicato: http://stackoverflow.com/questions/627643/sql-formatting-tool –

risposta

13

usare soltanto: -

string sql = 
    @"select * 
    from person 
    where id = :id"; 

Questo è dal punto di vista identica alla soluzione singola linea compilatori. Anche se non sarei sorpreso di vedere la concatenazione di stringhe letterali ottimizzata dal compilatore comunque. Tuttavia, il comune trambusto con l'approccio di concatenazione è dimenticare di includere spazi bianchi alla fine della stringa.

+1

Ottimo suggerimento sull'uso "@". Ho usato la e commerciale per molte altre "cose ​​a corda", ma non ho mai saputo che ha funzionato per roba multi linea! – kaze

+1

Ricorda che con la sintassi "@" come mostrato, ti ritroverai con una stringa diversa rispetto all'originale: il carrello ritorna, i linefeed e gli spazi bianchi extra saranno tutti inclusi. Quindi la tua stringa sarà "seleziona * \ r \ n dalla persona \ r \ n dove id =: id". In questo caso non importa molto, ma in alcuni casi la differenza è importante. –

+0

StackOverflow ha rimosso gli spazi bianchi extra dal mio commento precedente. Dovrebbero esserci cinque spazi dopo ogni "\ r \ n". –

7

È possibile utilizzare

string s = @"SELECT * 
FROM person 
WHERE id = :id"; 
+0

+1 per lasciare che la stringa "si attacchi" a sinistra piuttosto che indentare le righe successive. – Kleinux

6

costanti stringa vengono piegate al momento della compilazione così i due frammenti di codice di cui sopra sono sostanzialmente identiche.

Che si tratti di una buona idea avere stringa SQL in linea è tutta un'altra cosa ...

+0

Vero, nel mio caso però, spesso non ho scelta, ma usare SQL inline, quindi voglio solo sfruttare al meglio la situazione. – kaze

+0

+1 per "piegato" – Dan

6

Ah - una delle verità eterne di C#. Quale è meglio, codice che concatena stringhe usando + o codice che non lo fa? Nel tuo caso, la risposta dipende da quale versione di .NET stai usando. NET1 potrebbe solo ottimizzare la stringa + in una singola istruzione fino ad ora. Troppi + in una singola stringa hanno portato a prestazioni peggiori in quanto il compilatore ha dovuto ricorrere alla creazione di nuove istanze di stringa per far fronte a parti di stringa aggiuntive. Da .NET 2, l'architettura è leggermente cambiata e le istruzioni multiple + sono concatenate senza problemi dal compilatore.

+2

Grazie per il downvote - chiunque l'abbia fatto. Per favore, spiega perché pensi che questa risposta sia sbagliata, in modo che tutti possano imparare da essa. –

10

È possibile verificare questo con un semplice programma:

Console.WriteLine("a" + "b"); 

Utilizzando reflector, si può facilmente smontare il binario risultante. In modalità di rilascio, l'IL questo genera è:

L_0000: ldstr "ab" 
L_0005: call void [mscorlib]System.Console::WriteLine(string) 

Così .NET fa ottimizzare "stringhe formattate abbastanza".

+0

Ottima risposta :) –