我们在代码中使用的大部分内容都是字符串。让我们看一下 C# 字符串的一些新功能……包括 C# 11 中新增的原始字符串文字和原始字符串插值。
原始字符串字面量可以简单灵活地构建复杂的多行字符串,包括 JSON。无需逃避。
对应视频教程:https://www.java567.com/open/1
在本文中,我们将从当前用于处理字符串的一些技术、我们在使用这些技术时遇到的问题以及有助于我们处理字符串的新 C# 11 功能开始。
带引号的字符串字面量
我们在 C# 中处理字符串的主要方式是使用带引号的字符串文字。这些从 C# 开始就可用。
string header = "<div class=\"card-header\">Vehicle Detail</div>"
但是如果我们的字符串中有引号,字符串就会变得有点乱。我们用反斜杠转义这些引号。这样 C# 编译器就可以区分外部引号和字符串中的任何引号。
标准带引号的字符串文字通常最适合没有需要转义字符的单行字符串。
逐字字符串文字
对于跨越多行的字符串,我们使用逐字字符串文字。我们定义了一个逐字字符串文字,在第一个引号前面有一个 at 符号。Verbatim 的意思是“按原样”,意在定义一个“按原样”显示的多行字符串。
string header = @"
<div class=""card"">
<div class=""card-header"">
Vehicle Detail
</div>
";
但再一次,引号是一个挑战!逐字字符串文字要求我们使用双引号来指示字符串中的引号。在这种情况下这看起来并不可怕......但是当创建一个带有很多引号的字符串时,比如定义 JSON,它可能会非常混乱。
另外,逐字字符串文字的缩进可能是个问题。
foreach (var vehicle in vehicles)
{
if (goodCredit)
{
if (newVehicle)
{
message = @"
Congratulations on your new vehicle!
We hope you enjoy driving it as much as we enjoyed building it.
";
}
}
}
上面我们有一段典型的带有多个缩进的代码。我们在 if 块中很好地缩进了消息。但是,如果我们显示该消息,则会包含缩进,如图 1 所示。这可能不是所需的结果。
图 1. Verbatim 字符串文字保留其缩进
要修复它,我们必须取消缩进文本以与左边距对齐。
foreach (var vehicle in vehicles)
{
if (goodCredit)
{
if (newVehicle)
{
message = @"
Congratulations on your new vehicle!
We hope you enjoy driving it as much as we enjoyed building it.
";
}
}
}
结果更好,如图 2 所示。但是代码看起来有点乱。如果一些毫无戒心的开发人员过来“清理”缩进,我们的结果将与我们预期的不同。
图 2. Verbatim 字符串文字必须在代码中缩进以显示无缩进
原始字符串文字(C#11 中的新功能)
2022 年发布的 C# 11 中的一项新功能是原始字符串文字。原始字符串文字是字符串文字的一种新格式。它们允许空格、换行、嵌入引号、其他特殊字符或其他任何内容!
原始字符串文字至少以 3 个引号开头。并以一组匹配的引号结尾。开头和结尾引号之间的所有内容都是所需的字符串。
string header = """
<div class="card">
<div class="card-header">
Vehicle Detail
</div>
</div>
""";
请注意,不需要加倍引号或任何转义字符。字符串完全按原样显示。对于多行字符串,这是比原始逐字字符串文字更好的选择。
原始字符串文字的另一个重要特征是生成的字符串与右引号对齐。在下面的示例中,我们将消息与结束语的开头对齐。
foreach (var vehicle in vehicles)
{
if (goodCredit)
{
if (newVehicle)
{
message = """
Congratulations on your new vehicle!
We hope you enjoy driving it as much as we enjoyed building it.
""";
}
}
}
当我们显示此字符串时,它与左边距适当对齐,如图 3 所示。
图 3. 原始字符串文字根据结束引号缩进
回想一下,我说过原始字符串文字至少以三个引号开头。C# 团队希望该功能具有较长的生命周期,因此他们将其设为可配置。如果出于某种原因您需要在字符串中使用三引号,则可以使用四引号将原始字符串文字括起来。只要确保字符串以相同数量的引号结尾即可。
单行原始字符串文字要求开始和结束引号在同一行。这是单行原始字符串文字。注意开头和结尾的三个引号。然后嵌入的引号不需要任何特殊字符。
string text = """He said, "None shall Pass"."""
多行原始字符串文字要求起始引号位于原始字符串上方的行中,结束引号位于原始字符串下方的各自行中。这是一个使用原始字符串文字定义的 JSON 字符串。请注意,我们可以在字段名称和字符串值两边使用普通引号。所以我们的 JSON 看起来像 JSON。
string vehicleJSON = """
{
"id": 1,
"name": "AT-AT",
"price": 19416.13
}
""";
由于原始字符串文字的缩进是由结束引号的开头定义的,因此文本不得超出该结束引号集。
下面的示例在右引号的左侧有结束花括号。因此,此代码会生成一个语法错误,如图 4 所示。
string vehicleJSON = """
{
"id": 1,
"name": "AT-AT",
"price": 19416.13
}
""";
图 4. 原始字符串文字超出右引号缩进时的错误消息
在处理多行或带有引号或其他需要转义序列的特殊字符的字符串时,使用原始字符串文字而不是逐字字符串。
凭借原始字符串文字的强大功能、灵活性和清晰度,您可能再也不会使用逐字字符串文字了!
字符串插值
我们经常希望在字符串中包含变量或表达式的值。这就是插值的目的。字符串插值允许我们将表达式插入到字符串文字中。
string pageTitle = "Vehicle Detail";
string header = $"Header: {pageTitle}";
我们在第一个引号前标识了一个带有美元符号的内插字符串。我们使用大括号将一个或多个表达式添加到字符串中。花括号充当占位符。
在运行时,对表达式求值,适当的值出现在字符串中代替花括号和表达式。这样我们就可以将变量或表达式的值嵌入到字符串文字中。
这里有些例子。我们可以包括一个计算或调用一个方法。任何有效的 C# 表达式都可以插入花括号内。
string answer = $"Answer: { 20 * 2 + 2 }";
string pageTitle = "Vehicle Detail";
string header = $"Header: {PrepareTitle(pageTitle)}";
常量字符串插值(C# 10 中的新增功能)
从 C# 10 开始,我们可以将内插字符串定义为常量……但前提是内插表达式是常量,如本例所示。
const string pageTitle = "Vehicle Detail";
const string header = $"Header: {pageTitle}";
由于在这个例子中内插表达式是一个常量,所以内插字符串可以定义为一个常量。这可能不是一个很常见的要求,但很高兴知道该功能在您需要时可用。
插值表达式中的换行符(C# 11 中的新增功能)
C# 11 中的新功能,我们可以使用多行内插表达式。这可以使花括号内的代码更易于阅读。
在此示例中,我们使用三元条件运算符。如果页面标题变量为空,我们设置“无标题”,否则我们设置页面标题。请注意,我们必须将三元条件运算符括在大括号内的圆括号中。
string pageTitle = "";
string header = $"Header: {
(pageTitle == ""
? "No title"
: pageTitle)
}";
在插值表达式中放置太多代码会使该代码难以调试和测试。因此,请注意您在内插表达式中编写了多少代码。在某些情况下,将代码放在一个函数中并从内插表达式调用该函数可能会更好
逐字字符串插值
我们可以使用@$
or将字符串插值与逐字字符串结合起来$@
。这样我们就可以有多行文本,也可以选择多行用于我们的插值表达式。
string pageTitle = "Vehicle Detail";
string header = @$"
<div class=""card"">
<div class=""card-header"">
{(pageTitle == ""
? "No title"
: pageTitle)}
</div>
</div>
";
但由于它是一个逐字字符串,我们再次需要双引号来表示任何嵌入的引号。
原始字符串插值(C# 11 中的新增功能)
字符串插值的更好选择是原始字符串插值,可在 C# 11 中使用。这里我们在三组引号前添加美元符号。然后我们可以为我们的插值表达式定义多行文本和多行。
string pageTitle = "Vehicle Detail";
string header = $"""
<div class="card">
<div class="card-header">
{(pageTitle == ""
? "No title"
: pageTitle)}
</div>
</div>
""";
让我们看另一个示例,创建一个 JSON 字符串。这是我们要创建的字符串。但是我们想对价格使用插值而不是对其进行硬编码。
{
"id": 1,
"name": "AT-AT",
"price": 19416.13
}
请注意,JSON 语法需要用大括号括住对象。但是如果我们想使用插值字符串,插值需要花括号。那么我们需要避开那些花括号吗?没有!
C# 团队想要一个可配置的字符串插值解决方案。因此对于原始字符串插值,我们可以选择使用两个美元符号。两个美元符号意味着我们需要两组花括号来进行插值。这样,单组大括号就可以解释为字符串文字的一部分。
decimal price = 19416.13M;
string vehicleJSON = $$"""
{
"id": 1,
"name": "AT-AT",
"price": {{price}}
}
""";
或者我们可以使用三个美元符号和三组花括号,等等。美元符号的数量表示插值所需的花括号对的数量。
很酷!
包起来
本教程介绍了用于定义字符串文字和字符串插值的选项。
新的原始字符串文字和原始字符串插值简化了字符串管理,为处理字符串提供了灵活的解决方案。
对应视频教程:https://www.java567.com/open/1
标签:文字,string,示例,C#,引号,插值,字符串 From: https://www.cnblogs.com/web-666/p/17436882.html