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

时间:2010-03-06 10:53:43

标签: 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 UserID, UserName
     FROM Users
     INNER JOIN SomeOtherTable ON xxxxx
     WHERE UserID IN (blablabla)";

它保持代码可读但保存连接。现在它真的保存了任何性能,或者编译器是否足够智能“预连接”第一个字符串?

2 个答案:

答案 0 :(得分:10)

是的,编译器足够智能以优化常量字符串连接。为了证明这一点,我们来看看以下方法:

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也足够聪明: - )

答案 1 :(得分:6)

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