首页 > 编程语言 >C# 中的字符串——新增功能,通过代码示例进行解释

C# 中的字符串——新增功能,通过代码示例进行解释

时间:2023-05-27 16:11:16浏览次数:52  
标签:文字 string 示例 C# 引号 插值 字符串

我们在代码中使用的大部分内容都是字符串。让我们看一下 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 所示。

Hy7tMtzRcGw1AAAAAElFTkSuQmCC图 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

相关文章

  • CentOS配置软件级RAID
    步骤yuminstallmdadm#创建虚拟RAID阵列mdadm-C/dev/md1-l1-n2/dev/sda/dev/sdbmdadm-D/dev/md1#挂载mkfs.xfs/dev/md1mkdir/datamount-txfs/dev/md1/datavi/etc/fstab/dev/md1/dataxfsdefaults00引用Linux配置虚拟RAID阵列linux下raid......
  • 【cplusplus教程翻译】指针(Pointers)
    在前面的章节中,变量被解释为计算机内存中的位置,可以通过其标识符(名称)访问这些位置。这样,程序就不需要关心内存中数据的物理地址;只要需要引用变量,它就简单地使用标识符。对于C++程序来说,计算机的内存就像一系列的存储单元,每个存储单元的大小都是一个字节,并且每个存储单元都有一个......
  • Nginx配置Basic_Auth登录认证
    一般来说,僵尸网络的扫描行为都是全互联网大范围进行的,并且所探测的漏洞大多都是一些新爆发的cms漏洞(ThinkPHP)、或者是一些常见的框架组件漏洞(如Struts2),针对该特性,我们可以配置BasicAuth登录认证(ngx_http_auth_basic_module),来减少僵尸网络对我们web服务的侵扰。注:BasicAuth......
  • webpack相关
    npm是第三方包管理器,npminit之后会生成一个package.json文件,里面展示了项目中依赖的第三方包信息。下载完node之后,npmjiu自动下载好了。npmipackageName-S(-S是--save的缩写,依赖会保存在package.json文件的dependencies里面,意思是这个包在生产环境中需要,用户会用到这个......
  • 网安--Docker
    二、容器技术Docker1、开箱即用2、快速部署3、可移植性强4、环境隔离docker可以理解为假的操作系统,可以不安装操作系统使用,虚拟机必须按照操作系统,速度更快,占用内存更小一般为mb,进程间隔离性差,安全性差。docker可以打包好一个环境,如(一键安装php+mysql+apache)......
  • java——微服务——spring cloud——Eureka——搭建Eureka服务
        创建新工程:    创建main函数,并添加注解      编写参数:     启动:     点击打开浏览器:              ......
  • Cassandra中的MerkleTree反熵机制
    构建MerkleTreeCassandra是一个分布式数据库系统,它使用Merkle树来实现数据一致性和数据完整性的验证。在Cassandra中,每个节点都维护着自己的数据副本。为了确保数据的一致性和完整性,Cassandra使用Merkle树进行验证。Merkle树是一种树状结构,由哈希值构成,用于对数据块进......
  • PyCharm:PyCharm常用快捷命令
    为了提高编写代码的速度,以及方面程度,需要知道一些常用的快捷键。最常用的是:1.ctrl+c复制2.ctrl+d快速复制选中的内容并粘贴3.Ctrl+shift+n通过文件名快速查找工程内的文件4.ctrl+a全选5.Ctrl+alt+l调整代码格式6.Alt+enter导入模块7.Ctrl+z回退8.ctrl+x剪贴9.ctrl+/......
  • 基于MIMO-OFDM通信系统的误码率matlab仿真,对比了MRC,ZF等多种接收器性能
    1.算法仿真效果matlab2022a仿真结果如下:  2.算法涉及理论知识概要    MIMO-OFDM系统的接收信号是多个发射天线发送信号的衰落与加性噪声的线性叠加,若采用通常SISO-OFDM系统或MIMO系统的估计算法估计信道,将会带来很大的估计误差。出于设计实现的考虑,本文主要研究理论相......
  • 配置 Orchestra Python API
    简介:OrchestraPythonAPI是开发者构建本地工具链的定海神针,你可以轻而易举的把它集成到制作流程中,拓展自身业务的边界。OrchestraPythonAPI与网页端接口高度同构,不仅易于理解和使用,还兼容python2.7至3.11的版本。OrchestraPythonAPI工具并不附带Python运行环境......