构造大字符串(例如SQL命令)C#编译器有多聪明?

构造大字符串(例如SQL命令)C#编译器有多聪明?,c#,string-concatenation,C#,String Concatenation,这听起来可能很愚蠢,但是 创建大型SQL命令时,我希望保持代码可读性,我这样做: cmd.CommandText = "SELECT top 10 UserID, UserName " + "FROM Users " + "INNER JOIN SomeOtherTable ON xxxxx " + "WHERE UserID IN (blablabla)"; 看到连接了吗?现在,为了节省性能,我现在执行以下操作: cmd.CommandText = @"SELECT top 10 Us

这听起来可能很愚蠢,但是

创建大型SQL命令时,我希望保持代码可读性,我这样做:

cmd.CommandText = "SELECT top 10 UserID, UserName " +
 "FROM Users " +
 "INNER JOIN SomeOtherTable ON xxxxx " +
 "WHERE UserID IN (blablabla)";
看到连接了吗?现在,为了节省性能,我现在执行以下操作:

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

它使代码保持可读性,但保存连接。现在它真的节省了性能吗?或者编译器足够聪明,可以“预连接”第一个字符串?

是的,编译器足够聪明,可以优化常量字符串连接。为了证明这一点,让我们检查以下方法:

public static string Concat()
{
    return "a" + "b";
}
在发布模式下编译,这将生成以下IL:

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

请注意优化。因此,就性能而言,这两种方法是相同的。唯一的区别是,在第二种情况下,您将在字符串中获得新行(\r\n),因此它们不会生成完全相同的字符串,但SQL Server也足够聪明:-)

是的,编译器将在编译时对常量数字和字符串计算算术运算。但是,回答此类性能问题的更好方法是自己尝试。走出StopWatch类,双向编写代码,在循环中运行十亿次,然后你就会知道。

有人教过你SQL注入攻击吗?这正是它们的开始。我发现第二种形式更具可读性。如果编译器那么聪明,你就会失去工作。String.Format是我认为可读的,而不是您喜欢的方式。2slugster:这只是一个示例,当然我会将所有命令参数化。。。顺便说一句,我没有看到任何注射的可能性。串联用于连续字符串