Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#源代码中打断长字符串的最佳方法_C#_String - Fatal编程技术网

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

在C#源代码中打断长字符串的最佳方法,c#,string,C#,String,我想知道在C#源代码中打断长字符串的“最佳实践”是什么。这是绳子吗 "string1"+ "string2"+ "string3" 编译期间或运行时连接?连接在编译时完成,因此没有运行时开销。在编译时完成。这完全等同于“string1string2string3” 假设你有: string x = "string1string2string3" string y = "string1" + "string2" + "string3" 编译器将执行适当的内部处理,以便x和y引用相同的对象 编辑

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

"string1"+
"string2"+
"string3"

编译期间或运行时连接?

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

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

假设你有:

string x = "string1string2string3"
string y = "string1" + "string2" + "string3"
编译器将执行适当的内部处理,以便x和y引用相同的对象


编辑:答案和评论中有很多关于
StringBuilder
的讨论。许多开发人员似乎认为字符串连接应该始终使用
StringBuilder
完成。这是一种过度概括,值得理解。

您不能使用
StringBuilder

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


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

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

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

string query = @"SELECT whatever
FROM tableName
WHERE column = 1";
// foo      bar hello        world.
var mySingleLineText = @"
    foo      bar
    hello        world.
".AsOneLine();

这将为您提供一个带有换行符和制表符的字符串,但是对于一个无关紧要的查询来说。

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

在上面的示例中使用String.Concat是在编译时完成的。 因为它们是文本字符串,所以编译器会对它们进行优化

但是,如果使用变量:

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

这是在运行时完成的。

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

如果你只是做了几个字符串(5个或更少是一个好规则),那么无论你使用哪种类型的连接,速度都是无关紧要的。

有任何方法可以做到这一点。 我的Favorite使用C#中的字符串方法。 示例一:

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

以下内容如何(灵感来源于常用标记方法)

…与所使用的组件结合使用:

var mySingleLineText = @"
    If we wish to count lines of code, we should not regard them
    as 'lines produced' but as 'lines spent'.
".AsOneLine();
请注意,字符串“内部”的空格保持不变,例如:

string query = @"SELECT whatever
FROM tableName
WHERE column = 1";
// foo      bar hello        world.
var mySingleLineText = @"
    foo      bar
    hello        world.
".AsOneLine();
如果不希望用空格替换换行符,则将
作为参数传递给扩展方法:

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

请注意:由于所涉及的helper方法,这种形式的字符串连接是在运行时进行的(与编译时通过
+
运算符进行的连接不同,也在可接受的答案中说明了这一点)。所以,如果性能是一个问题,请使用
+
。如果您处理的是较长的短语和可读性,并且“易用性”是重点,那么上面建议的方法可能值得考虑。

这样做会降低代码的可读性和性能。换句话说,这是一件坏事。公平地说,我认为如果你做了大量的连接,那么推荐使用stringbuilder?如果你在运行时做了大量的连接,那么是的,推荐使用stringbuilder。但是上面的示例有静态字符串,因此编译器已经将其优化为单个字符串。即使在运行时完成连接,使用“+”连接两个字符串也比使用StringBuilder快。好吧,我确实说了“lots”=)但你是对的,我应该对此做进一步的限定。你的概括太笼统了——如果你能一次完成整个连接,通常比使用StringBuilder更快(更可读)。因此,与新的StringBuilder(x.Append(y.Append(z.ToString))相比,更喜欢“x+y+z”。当存在重复连接时,StringBuilder非常有用。。。StringBuilder在循环等操作时非常有用。对于单个操作集,string.Concat更简单,工作原理也一样。感谢Marc-我已经用完了空间:)编辑了我的答案,指向我的StringBuilder文章,尽管…+运算符实际上调用了Concat方法。如果您想了解StringBuilder的实现,它会更聪明一些:)只有在循环一组数据时,“多于4个”才相关;否则,对string.Concat的单个调用(如有必要,传递数组)是相同的。您所说的是正确的。字符串生成器是更快的运行时解决方案,但是在编译时对给定的表达式进行更好的计算(我认为这对编译器来说不应该是一个问题)这似乎不允许在字符串中使用转义引号,例如\“您好,对于逐字字符串Literal
@
您总是需要使用双引号而不是斜杠(\”)来转义引号,例如,
@“hello”“{name}”,您好”另见:啊,漂亮的把戏!我站直了,谢谢