在 C 中连接字符串#

Tip

本文是已了解至少一种编程语言并正在学习 C# 的开发人员的 “基础知识 ”部分的一部分。 如果你不熟悉编程,请先 学习入门 教程。

来自另一种语言? C# 中使用 + 进行串联与 Java 和 JavaScript 类似。 C# 添加字符串内插$"{x}"),类似于 JavaScript 模板文本和Python f 字符串,作为从变量生成字符串的首选方法。 对于在循环中生成字符串,C# 提供StringBuilder,非常类似于Java。StringBuilder

串联 将一个字符串追加到另一个字符串的末尾,以生成一个新字符串。 C# 提供了几种连接方式,最佳选择取决于是联接一组固定值还是集合,还是在循环中逐条生成字符串。

串联字符串字面量

当你用 + 连接字符串字面量或常量时,编译器会在编译时将它们拼接在一起。 将长字面量拆分到多行中可提高源代码的可读性,且不会产生任何运行时开销:

// The compiler joins adjacent string literals at compile time,
// so splitting a long literal across lines has no run-time cost.
string message =
    "This is the first sentence of a longer message. " +
    "This is the second sentence. " +
    "This is the third and final sentence.";

Console.WriteLine(message);
// => This is the first sentence of a longer message. This is the second sentence. This is the third and final sentence.

使用++=运算符

若要合并字符串变量,请使用 + 运算符生成新字符串,或 += 追加到现有字符串。 运算符 + 非常直观,即使将多个运算符链接在单个表达式中,编译器也仅复制一次字符串内容:

string name = "Alex";
string day = "Monday";

// Use + to build a string from variables and literals.
string greeting = "Hello " + name + ". Today is " + day + ".";
Console.WriteLine(greeting);
// => Hello Alex. Today is Monday.

// Use += to append to an existing string.
greeting += " How are you today?";
Console.WriteLine(greeting);
// => Hello Alex. Today is Monday. How are you today?

注释

在字符串串联中,C# 将字符串 null 视为空字符串,因此串联 null 不会向结果添加任何内容。

使用字符串内插

若要在字符串中嵌入计算表达式,首选字符串内插而不是位置占位符,如{0}{1}继承自 C 样式格式的标记String.Format。 内插会以内联方式将每个表达式放其值的出现位置,因此结果字符串仍然易于阅读,而且不会错配参数:

string name = "Alex";
string day = "Monday";

// String interpolation reads better than a chain of + operators.
string greeting = $"Hello {name}. Today is {day}.";
Console.WriteLine(greeting);
// => Hello Alex. Today is Monday.

当每个内插表达式本身都是常量字符串时,可以将内插结果分配给 const 字符串。

联接字符串集合

若要组合一个集合中的元素,请使用 String.Concat 将它们连接起来且不使用分隔符,或使用 String.Join 在各元素之间添加分隔符:

string[] words = ["The", "quick", "brown", "fox"];

// Concat joins the sequence with no separator.
string runTogether = string.Concat(words);
Console.WriteLine(runTogether);
// => Thequickbrownfox

// Join places a separator between each element.
string sentence = string.Join(' ', words);
Console.WriteLine(sentence);
// => The quick brown fox

string.Join 只要需要带分隔符的输出(例如逗号分隔值或空格分隔的单词),都是正确的工具。

在循环中生成字符串

每个 ++= 操作都会创建一个新字符串,因为字符串是不可变的。 在循环中追加多个部分时,该分配会相加。 类 StringBuilder 改为在单个缓冲区中生成结果:

// StringBuilder builds a string in place, which suits loops
// that append many pieces.
var builder = new StringBuilder();
for (int i = 1; i <= 3; i++)
{
    builder.AppendLine($"Line {i}");
}

Console.Write(builder.ToString());
// => Line 1
// => Line 2
// => Line 3

当片段数量较多或在编译时无法确定时,请使用 StringBuilder。 对于固定的小值集, + 运算符和字符串内插更清晰。 有关每个方法性能最佳时的指南,请参阅 stringStringBuilder 类型”。

另见