在C#源代码中打破长字符串的最佳方法

时间:2008-11-12 10:07:52

标签: c# string

我想知道在C#源代码中打破长字符串的“最佳实践”是什么。这是字符串

"string1"+
"string2"+
"string3"

在编译期间或运行时连接?

10 个答案:

答案 0 :(得分:50)

它在编译时完成。这完全等同于“string1string2string3”。

假设你有:

string x = "string1string2string3"
string y = "string1" + "string2" + "string3"

编译器将执行适当的实习,使x和y引用相同的对象。

编辑:答案和评论中有很多关于StringBuilder的讨论。许多开发人员似乎认为字符串连接始终StringBuilder完成。这是一种过度概括 - 值得理解why StringBuilder is good in some situations, and not in others

答案 1 :(得分:39)

如果空格不重要,那么可以使用@ escape字符在代码中编写多行字符串。 如果您的代码中有查询,这很有用:

string query = @"SELECT whatever
FROM tableName
WHERE column = 1";

这将为您提供包含换行符和制表符的字符串,但对于无关紧要的查询。

答案 2 :(得分:7)

您的示例将在编译时连接。所有内联字符串和const字符串变量在编译时连接在一起。

要记住的是,包括任何只读字符串将延迟连接到运行时。 string.Empty和Environment.NewLine都是只读字符串变量。

答案 3 :(得分:3)

串联在编译时完成,因此没有运行时开销。

答案 4 :(得分:1)

这实际上取决于你需要什么。通常,如果需要连接字符串,则可以使用StringBuilder实现运行时的最佳性能。 如果您在源代码中引用类似var str =“String1”+“String2”的内容,那么在编译时它将转换为字符串str =“String1String2”。在这种情况下,您没有连接开销

答案 5 :(得分:1)

StringBuilder是一个很好的方法 你有很多(超过四个) 字符串连接。它更快。

在上面的示例中使用String.Concat是在编译时完成的。 由于它们是文字字符串,因此它们由编译器进行优化。

但是如果你使用变量:

string a = "string1";
string b = "string2";
string c = a + b;

这是在运行时完成的。

答案 6 :(得分:0)

你不能使用StringBuilder吗?

答案 7 :(得分:0)

有什么办法可以做到。 我最喜欢的是使用C#中的字符串方法。 样本一:

string s = string.Format(“{0} {1} {0}”,“Hello”,“By”); 结果是s =“Hello By Hello”;

答案 8 :(得分:0)

接下来的extension method(受通用标签oneLine方法的启发)...

using System;
using System.Text.RegularExpressions;
using static System.Text.RegularExpressions.RegexOptions;

namespace My.Name.Space
{
    public static class StringHelper
    {
        public static string AsOneLine(this string text, string separator = " ")
        {
            return new Regex(@"(?:\n(?:\s*))+").Replace(text, separator).Trim();
        }
    }
}

...与这样使用的verbatim string literal组合:

var mySingleLineText = @"
    If we wish to count lines of code, we should not regard them
    as 'lines produced' but as 'lines spent'.
".AsOneLine();

请注意,字符串“内部”的空格保持不变,例如:

// foo      bar hello        world.
var mySingleLineText = @"
    foo      bar
    hello        world.
".AsOneLine();

如果您不希望用空格替换换行符,则将""作为扩展方法的参数:

// foobar
var mySingleLineText = @"
    foo
    bar
".AsOneLine("");

请注意:由于涉及辅助方法,因此这种形式的字符串连接是在运行时进行的(与在编译时通过+运算符进行的连接相反)在接受的答案中说明)。因此,如果性能成为问题,请使用+。如果您要处理的是冗长的短语和可读性,并且“易用性”是重点,那么上面建议的方法可能值得考虑。

答案 9 :(得分:-3)

如果使用任意数量的字符串,StringBuilder将是您最快的方法。

http://dotnetperls.com/Content/StringBuilder-1.aspx

如果您只是做了一些字符串(5或更少是一个好规则),速度将与您正在使用的串联无关。