2010-03-06 8 views
6

Questo può sembrare stupido, ma ...Costruire grandi stringhe (ad esempio per i comandi SQL) quanto è intelligente il compilatore C#?

Quando creo comandi SQL grandi voglio mantenere il mio codice leggibile e faccio questo:

cmd.CommandText = "SELECT top 10 UserID, UserName " + 
"FROM Users " + 
"INNER JOIN SomeOtherTable ON xxxxx " + 
"WHERE UserID IN (blablabla)"; 

Vedi le concatenazioni? Ora, per salvare le prestazioni io ora faccio questo:

cmd.CommandText = @"SELECT top 10 UserID, UserName 
    FROM Users 
    INNER JOIN SomeOtherTable ON xxxxx 
    WHERE UserID IN (blablabla)"; 

Mantiene il codice leggibile ma salva concatenazioni. Ora salva davvero le prestazioni o il compilatore è abbastanza intelligente da "pre-concatenare" la prima stringa?

+2

Qualcuno ti ha insegnato sugli attacchi con iniezione SQL? Questo è esattamente come iniziano. – slugster

+0

Trovo il secondo modulo (molto) più leggibile. –

+0

Se il compilatore fosse così intelligente, si perderebbe il lavoro. Un formato String.Format è ciò che trovo leggibile, non nel modo che preferisci. –

risposta

10

Sì, il compilatore è abbastanza intelligente da ottimizzare le concatenazioni di stringhe costanti. Per dimostrare questo esaminiamo il seguente metodo:

public static string Concat() 
{ 
    return "a" + "b"; 
} 

compilato in modalità di rilascio Questo produce il seguente IL:

.method public hidebysig static string Concat() cil managed 
{ 
    .maxstack 8 
    L_0000: ldstr "ab" 
    L_0005: ret 
} 

Avviso l'ottimizzazione. Quindi in termini di prestazioni entrambi i metodi sono identici. L'unica differenza è che nel secondo caso otterrete nuove righe (\ r \ n) nella stringa, quindi non produrranno esattamente la stessa stringa ma anche SQL Server è abbastanza intelligente :-)

6

Sì, il compilatore calcolerà le operazioni aritmetiche su numeri e stringhe costanti in fase di compilazione. Tuttavia, il modo migliore per rispondere a domande relative alle prestazioni come questa è provarlo tu stesso. Prendi la classe StopWatch, scrivi il codice in entrambi i modi, eseguilo un miliardo di volte in un ciclo, e poi lo saprai.

Problemi correlati