【.NET Core】深入理解C#中的特殊字符

【.NET Core】深入理解C#中的特殊字符

文章目录

  • 【.NET Core】深入理解C#中的特殊字符
    • 一、概述
    • 二、$-- 字符串内插
      • 2.1 内插字符串的结构
      • 2.2 内插原始字符串字面量
      • 2.3 特殊字符
      • 2.4 内插字符串编译
    • 三、@-- 逐字字符串标识符
    • 四、“”“--原始字符串文本

在这里插入图片描述

一、概述

特殊字符是预定义的上下文字符,用于修饰最前面插入了此类字符的程序元素(文本字符串,标识符或属性名称)。C#支持以下特殊字符:

  • @:逐字字符串标识符字符
  • $: 内插入字符串字符

二、$-- 字符串内插

$ 字符将字符串字面量标识为内插字符串。 内插字符串是可能包含内插表达式的字符串文本 。 将内插字符串解析为结果字符串时,带有内插表达式的项会替换为表达式结果的字符串表示形式。

字符串内插为格式化字符串提供了一种可读性和便捷性更高的方式。它比字符串复合格式设置更容易。

public static void Main(string[] arg)
{var name = "Mark";var date = DateTime.Now;Console.WriteLine("Hello, {0}! Today is {1}, it's {2:HH:mm} now.", name, date.DayOfWeek, date);Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.");
}

从C#10开始,可以使用内插字符串来初始化常量字符串。仅当内插字符串中的所有内插表达式也是常量字符串时,才可以执行此操作。

2.1 内插字符串的结构

若要将字符串标识为内插字符串,可在该字符串前面加上$符号。字符串字面量开头的$"之间不能有任何空格。

具备内插表达式的项的结构如下所示:

{<interpolationExpression>[,<alignment>][:<formatString>]}
  1. interpolationExpression 生成需要设置格式的结果的表达式。null的字符串表示形式为String.Empty
  2. alignment 常数表达式,它的值定义表达式结果的字符串表示形式中的最小字符数。 如果值为正,则字符串表示形式为右对齐;如果值为负,则为左对齐。
  3. formatString 受表达式结果类型支持的格式字符串。
public static void Main(string[] arg)
{Console.WriteLine($"|{"Left",-7}|{"Right",7}|");const int FieldWidthRightAligned = 20;Console.WriteLine($"{Math.PI,FieldWidthRightAligned} - default formatting of the pi number");Console.WriteLine($"{Math.PI,FieldWidthRightAligned:F2} - display only three decimal digits");
}

从 C# 11 开始,可以在内插表达式中使用换行符,以使表达式的代码更具可读性。

下面的示例展示了换行符如何提高涉及模式匹配的表达式的可读性:

public static void Main(string[] arg)
{var safetyScore = 80;string message = $"The usage policy for {safetyScore} is" +$" {safetyScore switch{> 90 => "Unlimited usage",> 80 => "General usage, with daily safety check",> 70 => "Issues must be addressed within 1 week",> 50 => "Issues must be addressed within 1 day",_ => "Issues must be addressed before continued use",}}";Console.WriteLine(message);
}

2.2 内插原始字符串字面量

从C# 11开始,可以使用内插原始字符串字面量。如以下示例所示:

int X=2;
int Y=3;
var pointMessage = $"""The point"{X},{Y}" is {Math.Sqrt(X*X+Y*Y):F3} from the origin""";
Console.WriteLine(pointMessage);

要在结果字符串嵌入{}字符,请让内插原始字符串字面量以多个$字符开头。执行此操作时,任何长度短$字符数的{}字符序列都会嵌入到结果字符串中。若要将任何内插表达式包含该字符串中,需要使用与$字符数相同的大括号数。

如以下示例所示:

int X = 2;
int Y = 3;var pointMessage = $$"""{The point {{{X}}, {{Y}}} is {{Math.Sqrt(X * X + Y * Y):F3}} from the origin}""";
Console.WriteLine(pointMessage);

内插原始字符串字面量以两个$字符开头。需要将每个内插表达式放在双大括号{{}}之间。单个大括号嵌入到结果字符串中,如果需要重复的{}字符嵌入结果字符串中,请使用相应增加的$字符数来指定内插原始字符串字面量。

2.3 特殊字符

要在内插字符串生成的文本中包含大括"{“或”}",请使用两个大括号,即“{{”或“}}”。有关详细信息。

因为冒号(“:”)在内插表达式中具有特殊含义,为了在内插表达式使用条件运算符,请将表达式放在括号内。

下面示例演示了如何在结果字符串中包含大括号。下面示例演示如何使用条件运算符:

string name = "Horace";
int age = 34;
Console.WriteLine($"He asked, \"Is your name {name}?\", but didn't wait for a reply :-{{");
Console.WriteLine($"{name} is {age} year{(age == 1 ? "" : "s")} old.");

内插逐字字符串以$@字符开头。可以按任意顺序使用$@: $@"..."@$"..."均为有效的内插逐字字符串。

2.4 内插字符串编译

从C#10和.NET 6开始,编译器会检查内插字符串是否被分配给满足内插字符串处理程序模式要求的类型。内插字符串处理程序是一种内插字符串转换为结果字符串的类型。当内插字符串的类型为string时,它由System.Runtime.CompilerServices.DefaultInterpolatedStringHandle处理。

在C# 10之前,如果内插字符串类型为String,则通常将其转换为String.Format方法调用。如果分析的行为等同于串联,则编译器可将String.Format替换为String.Concat

如果内插字符串类型为IFormattableFormattableString,则编译器会生成对FormattableStringFactory.Create方法的调用。

三、@-- 逐字字符串标识符

@特殊字符用作原义标识符。通过以下方式使用它:

  • 指示将原义解释字符串。@字符在此实例中定义原义标识符。简单转义序列、十六进制转义序列和Unicode转义序列都将字面解释。只有引号转义序列(“”)不会被字面解释;因为它生成一个双引号。此外。如果是逐字内插字符串,大括号转义序列({{}})不按字面解释;它们会生成单个大括号字符。

    string filename1 = @"c:\documents\files\u0066.txt";
    string filename2 = "c:\\documents\\files\\u0066.txt";
    Console.WriteLine(filename1);
    Console.WriteLine(filename2);
    
  • 使用C#关键字作为标识符。@字符可作为代码元素的前缀,编译器将把此代码元素解释为标识符而非C#关键字。

    string[] @for={"John","James","Joan","Jamie"};
    for(int ctr = 0; ctr<@for.Length;ctr++)
    {Console.WriteLine($"Here is your gift, {@for[ctr]}!");
    }
    
  • 使编译器在命名冲突的情况下区分两种属性。属性是派生自Attribute的类。其类型名称通常包含后缀Attribute,但编译器不会强制进行转换。

四、“”“–原始字符串文本

原始字符串字面量以至少三个双引号()字符开始和结束:

var singleLine = """This is a "raw string literal". It can contain characters like \, ' and ".""";

原始字符串字面量可以包含多行:

var xml = """<element attr="content"><body></body></element>""";

以下规则控制多行原始字符串字面量的解释:

  • 左引号和右引号字符必须位于各自的行中
  • 右引号左侧的任何空格将从原始字符串字面量的所有行中删除。
  • 将忽略同一行中左引号后面的空格。
  • 字符串字面量中仅包含左引号后面的空格行

可能需要创建包含三个或更多连续双引号字符的原始字符串字面量。 原始字符串字面量可以至少三个双引号字符的序列开始和结束。 如果字符串字面量包含三个连续双引号,则以四个双引号字符开始和结束原始字符串字面量:

var moreQuotes = """" As you can see,"""Raw string literals""" can start and end with more than three double-quotes when needed."""";

原始字符串字面量还可以与内插字符串结合使用,以在输出字符串中嵌入{}字符。在内插的原始字符串字面量中使用多个$字符,以在输出字符串中嵌入{}字符,而无需对这些字符进行转义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/653062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网易】资深Java开发工程师/专家(采购系统方向)

全职 | 杭州市 | 2024-01-26 更新 职位描述 负责企业信息化采购系统研发。重点关注系统并发性能、可靠性等方面&#xff0c;解决系统技术难点&#xff0c;参与架构持续升级。关注互联网和企业信息化热点技术的发展方向&#xff0c;能够提出、评估并应用新技术。参与系统需求分…

OpenGL/C++_学习笔记(四)空间概念与摄像头

汇总页 上一篇: OpenGL/C_学习笔记&#xff08;三&#xff09; 绘制第一个图形 OpenGL/C_学习笔记&#xff08;四&#xff09;空间概念与摄像头 空间概念与摄像头前置科技树: 线性代数空间概念流程简述各空间相关概念详述 空间概念与摄像头 前置科技树: 线性代数 矩阵/向量定…

嵌入式产品的开发流程

嵌入式产品的开发流程主要涉及硬件和软件两个方面&#xff0c;通常包括以下主要阶段和角色&#xff1a; 嵌入式产品开发流程 1. 需求分析阶段&#xff1a; 角色&#xff1a; 产品经理、系统工程师 任务&#xff1a; 确定产品的功能和性能需求&#xff0c;明确硬件和软件的基…

RPC教程 5.支持HTTP协议

1.HTTP的CONNECT方法 Web 开发中&#xff0c;我们经常使用 HTTP 协议中的 HEAD、GET、POST 等方式发送请求&#xff0c;等待响应。但 RPC 的消息格式与标准的 HTTP 协议并不兼容&#xff0c;在这种情况下&#xff0c;就需要一个协议的转换过程。HTTP 协议的 CONNECT 方法提供了…

在Java中,IO主要分为两种:同步阻塞IO(BIO)和NIO(New IO,也称为Non-blocking IO)。

IO&#xff08;Input/Output&#xff09;是指输入和输出&#xff0c;是程序与外部世界或者程序与程序之间进行数据交换的一种方式。在Java中&#xff0c;IO主要分为两种&#xff1a;同步阻塞IO&#xff08;BIO&#xff09;和NIO&#xff08;New IO&#xff0c;也称为Non-blocki…

51单片机-4G模块

51单片机-4G模块 4G控制LED #include "reg52.h" #include "intrins.h" #include <string.h>#define SIZE 12 sfr AUXR 0x8E; sbit D5 P3^7; char cmd[SIZE];void UartInit(void) //9600bps11.0592MHz {AUXR 0x01;SCON 0x50; //配置串口工作方…

MybatisPlus二级映射和关联对象ResultMap

文章目录 一、业务背景1. 数据库表结构2. 需求 二、使用映射直接得到指定结构三、其他文件1. Mapper2. Service3. Controller 四、概念理解一级映射二级映射聚合 五、标签使用1. \<collection\> 标签2. \<association\> 标签 在我们的教程中&#xff0c;我们设计了…

flask框架制作前端网页作为GUI

一、语法和原理 &#xff08;一&#xff09;、文件目录结构 需要注意的问题&#xff1a;启动文件命名必须是app.py。 一个典型的Flask应用通常包含以下几个基本文件和文件夹&#xff1a; app.py&#xff1a;应用的入口文件&#xff0c;包含了应用的初始化和配置。 requirem…

MySQL中四种索引类型

FULLTEXT &#xff1a;即为全文索引&#xff0c;目前只有MyISAM引擎支持。其可以在CREATE TABLE &#xff0c;ALTER TABLE &#xff0c;CREATE INDEX 使用&#xff0c;不过目前只有 CHAR、VARCHAR &#xff0c;TEXT 列上可以创建全文索引&#xff0c;需要注意的是MySQL5.6以后支…

Controller的部分注解

目录 1.增加 用到注解 1.1RequestBody注解解析&#xff1a; 2.查询方法当中参数不用注解&#xff01; 3.起售停售用到注解 3.1PathVariable解析 4.删除菜品注解 4.1RequestParam 5.修改用到的注解 5.1修改分两步 用到两个注解 6&#xff1a;总结 1.增加 用到注解…

【DeepLearning-8】MobileViT模块配置

完整代码&#xff1a; import torch import torch.nn as nn from einops import rearrange def conv_1x1_bn(inp, oup):return nn.Sequential(nn.Conv2d(inp, oup, 1, 1, 0, biasFalse),nn.BatchNorm2d(oup),nn.SiLU()) def conv_nxn_bn(inp, oup, kernal_size3, stride1):re…

Java基础知识-异常

资料来自黑马程序员 异常 异常&#xff0c;就是不正常的意思。在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是&#xff1a; 异常 &#xff1a;指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;…

深入理解HarmonyOS UIAbility:生命周期、WindowStage与启动模式探析

UIAbility组件概述 UIAbility组件是HarmonyOS中一种包含UI界面的应用组件&#xff0c;主要用于与用户进行交互。每个UIAbility组件实例对应最近任务列表中的一个任务&#xff0c;可以包含多个页面来实现不同功能模块。 声明配置 为了使用UIAbility&#xff0c;首先需要在mod…

学习了解 Vue3 的 nextTick() 方法

学习了解 Vue3 的 nextTick() 方法 Vue.js 3 引入了一系列新的特性和改进&#xff0c;其中之一是 nextTick() 方法的优化和变化。nextTick() 方法在 Vue 中用于在 DOM 更新后执行回调函数&#xff0c;确保在更新之后获得最新的 DOM 状态。 1. Vue 3 中的 nextTick() 方法 在 …

跟着cherno手搓游戏引擎【10】使用glm窗口特性

修改ImGui层架构&#xff1a; 创建&#xff1a; ImGuiBuild.cpp&#xff1a;引入ImGui #include"ytpch.h" #define IMGUI_IMPL_OPENGL_LOADER_GLAD//opengl的头文件需要的定义&#xff0c;说明使用的是gald #include "backends/imgui_impl_opengl3.cpp" …

03_Opencv简单实例演示效果和基本介绍

视频处理 视频分解图片 在后面我们要学习的机器学习中,我们需要大量的图片训练样本,这些图片训练样本如果我们全都使用相机拍照的方式去获取的话,工作量会非常巨大, 通常的做法是我们通过录制视频,然后提取视频中的每一帧即可! 接下来,我们就来学习如何从视频中获取信息 ubun…

@Autowired和@Resource区别

目录 前言 一、Autowired 二、Resource 三、区别 前言 在Java的Spring框架中&#xff0c;依赖注入&#xff08;Dependency Injection, DI&#xff09;是一种核心的技术&#xff0c;它允许我们将所依赖的对象或属性以外部化的方式提供给一个对象&#xff0c;而不是在对象内部…

c#之构值类型和引用类型

值类型:(整数/bool/struct/char/小数) 引用类型:(string/ 数组 / 自定义的类 / 内置的类) 值类型只需要一段单独的内存,用于存储实际的数据 引用类型需要两段内存(第一段存储实际的数据,他总是位于 堆中第二段是一个引用,指向数据在堆中的存放位置) 当使用引用类型赋值的时…

C++:类 的简单介绍(一)

目录 类的引用&#xff1a; 类的定义&#xff1a; 类的两种定义方式&#xff1a; 成员变量命名规则的建议&#xff1a; 类的访问限定符及封装&#xff1a; 访问限定符 【访问限定符说明】 封装 class与struct的区别&#xff1a; 类的作用域&#xff1a; 类的实例化…

前端大厂面试题探索编辑部——第三期

目录 题目 单选题1 题解 关于浏览器缓存 Last-Modified/If-Modified-Since ETag/If-None-Match 关于浏览器删除缓存数据 单选题2 题解 跨域问题 用document.domain解决的问题 题目 单选题1 1.关于浏览器缓存&#xff0c;以下哪个选项是不正确的&#xff08;&#…