2010-03-06 7 views
6

Esto puede sonar estúpido, pero ...Construyendo cadenas grandes (por ejemplo, para comandos SQL) ¿qué tan inteligente es el compilador C#?

Cuando creo comandos SQL grandes que quiero mantener mi código legible y hago esto:

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

Ver las concatenaciones? Ahora, para salvar el rendimiento Ahora hago esto:

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

Se mantiene el código legible pero ahorra concatenaciones. Ahora, ¿realmente guarda algún rendimiento o el compilador es lo suficientemente inteligente como para "precatenar" la primera cadena?

+2

¿Alguien te ha enseñado acerca de los ataques de inyección SQL? Así es exactamente como comienzan. – slugster

+0

Encuentro la segunda forma (mucho) más legible. –

+0

Si el compilador fuera tan inteligente, perdería su trabajo. Un String.Format es lo que encuentro legible, no de la manera que te gusta. –

Respuesta

10

Sí, el compilador es lo suficientemente inteligente como para optimizar las concatenaciones de cadenas constantes. Para demostrar esto vamos a examinar el siguiente método:

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

Compilado en modo de lanzamiento Esto produce el siguiente IL:

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

Aviso la optimización. Entonces, en términos de rendimiento, ambos métodos son idénticos. La única diferencia es que en el segundo caso obtendrá nuevas líneas (\ r \ n) en la cadena, por lo que no producirán exactamente la misma cadena, pero SQL Server también es lo suficientemente inteligente :-)

6

Sí, el compilador calculará operaciones aritméticas en números y cadenas constantes en tiempo de compilación. Sin embargo, la mejor manera de responder preguntas de rendimiento como esta es probarlo usted mismo. Obtenga la clase de cronómetro, escriba el código de ambas formas, ejecútelo mil millones de veces en un ciclo, y entonces sabrá.

Cuestiones relacionadas