当前位置: 首页 > article >正文

windows C#-字符串和字符串字面量(三)

字符串转义序列

使用 \x 转义序列且指定的位数小于 4 个十六进制数字时,如果紧跟在转义序列后面的字符是有效的十六进制数字(即 0-9、A-F 和 a-f),则这些字符将被解释为转义序列的一部分。 例如,\xA1 会生成“¡”,即码位 U+00A1。 但是,如果下一个字符是“A”或“a”,则转义序列将转而被解释为 \xA1A 并生成“ਚ”(即码位 U+0A1A)。 在此类情况下,如果指定全部 4 个十六进制数字(例如 \x00A1),则可能导致解释出错。

在编译时,逐字字符串被转换为普通字符串,并具有所有相同的转义序列。 因此,如果在调试器监视窗口中查看逐字字符串,将看到由编译器添加的转义字符,而不是来自你的源代码的逐字字符串版本。 例如,原义字符串 @"C:\files.txt" 在监视窗口中显示为“C:\files.txt”。

981a5a2eb9cc4ed69ceb70c6ca7d3602.png

格式字符串

格式字符串是在运行时以动态方式确定其内容的字符串。 格式字符串是通过将内插表达式或占位符嵌入字符串大括号内创建的。 大括号 ({...}) 中的所有内容都将解析为一个值,并在运行时以格式化字符串的形式输出。 有两种方法创建格式字符串:字符串内插和复合格式。

字符串内插

在 C# 6.0 及更高版本中提供,内插字符串由 $ 特殊字符标识,并在大括号中包含内插表达式。 如果不熟悉字符串内插,请参阅字符串内插 - C# 交互式教程快速概览。

使用字符串内插来改善代码的可读性和可维护性。 字符串内插可实现与 String.Format 方法相同的结果,但提高了易用性和内联清晰度。

var jh = (firstName: "Jupiter", lastName: "Hammon", born: 1711, published: 1761);
Console.WriteLine($"{jh.firstName} {jh.lastName} was an African American poet born in {jh.born}.");
Console.WriteLine($"He was first published in {jh.published} at the age of {jh.published - jh.born}.");
Console.WriteLine($"He'd be over {Math.Round((2018d - jh.born) / 100d) * 100d} years old today.");

// Output:
// Jupiter Hammon was an African American poet born in 1711.
// He was first published in 1761 at the age of 50.
// He'd be over 300 years old today.

从 C# 10 开始,当用于占位符的所有表达式也是常量字符串时,可以使用字符串内插来初始化常量字符串。

从 C# 11 开始,可以将原始字符串字面量与字符串内插结合使用。 使用三个或更多个连续双引号开始和结束格式字符串。 如果输出字符串应包含 { 或 } 字符,则可以使用额外的 $ 字符来指定开始和结束内插的 { 和 } 字符数。 输出中包含任何更少的 { 或 } 字符序列。 以下示例演示了如何使用该功能来显示点与原点的距离,以及如何将点置于大括号中:

int X = 2;
int Y = 3;

var pointMessage = $$"""The point {{{X}}, {{Y}}} is {{Math.Sqrt(X * X + Y * Y)}} from the origin.""";

Console.WriteLine(pointMessage);
// Output:
// The point {2, 3} is 3.605551275463989 from the origin.

复合格式设置

String.Format 利用大括号中的占位符创建格式字符串。 此示例生成与上面使用的字符串内插方法类似的输出。

var pw = (firstName: "Phillis", lastName: "Wheatley", born: 1753, published: 1773);
Console.WriteLine("{0} {1} was an African American poet born in {2}.", pw.firstName, pw.lastName, pw.born);
Console.WriteLine("She was first published in {0} at the age of {1}.", pw.published, pw.published - pw.born);
Console.WriteLine("She'd be over {0} years old today.", Math.Round((2018d - pw.born) / 100d) * 100d);

// Output:
// Phillis Wheatley was an African American poet born in 1753.
// She was first published in 1773 at the age of 20.
// She'd be over 300 years old today.

子字符串

子字符串是包含在字符串中的任何字符序列。 使用 Substring 方法可以通过原始字符串的一部分新建字符串。 可以使用 IndexOf 方法搜索一次或多次出现的子字符串。 使用 Replace 方法可以将出现的所有指定子字符串替换为新字符串。 与 Substring 方法一样,Replace 实际返回的是新字符串,且不修改原始字符串。

string s3 = "Visual C# Express";
System.Console.WriteLine(s3.Substring(7, 2));
// Output: "C#"

System.Console.WriteLine(s3.Replace("C#", "Basic"));
// Output: "Visual Basic Express"

// Index values are zero-based
int index = s3.IndexOf("C");
// index = 7

访问单个字符

可以使用包含索引值的数组表示法来获取对单个字符的只读访问权限,如下面的示例中所示:

string s5 = "Printing backwards";

for (int i = 0; i < s5.Length; i++)
{
    System.Console.Write(s5[s5.Length - i - 1]);
}
// Output: "sdrawkcab gnitnirP"

如果 String 方法不提供修改字符串中的各个字符所需的功能,可以使用 StringBuilder 对象“就地”修改各个字符,再新建字符串来使用 StringBuilder 方法存储结果。 在下面的示例中,假定必须以特定方式修改原始字符串,然后存储结果以供未来使用:

string question = "hOW DOES mICROSOFT wORD DEAL WITH THE cAPS lOCK KEY?";
System.Text.StringBuilder sb = new System.Text.StringBuilder(question);

for (int j = 0; j < sb.Length; j++)
{
    if (System.Char.IsLower(sb[j]) == true)
        sb[j] = System.Char.ToUpper(sb[j]);
    else if (System.Char.IsUpper(sb[j]) == true)
        sb[j] = System.Char.ToLower(sb[j]);
}
// Store the new string.
string corrected = sb.ToString();
System.Console.WriteLine(corrected);
// Output: How does Microsoft Word deal with the Caps Lock key?

 


http://www.kler.cn/a/469535.html

相关文章:

  • 【微服务】3、配置管理
  • 20241230 AI智能体-用例学习(LlamaIndex/Ollama)
  • STM32 拓展 电源控制
  • SpringMVC的消息转换器
  • Python编程实例-机器学习中的Hinge Loss编程实现
  • GoFrame 基础入门
  • MySQL数据库基础 === DDL DML
  • AlphaPi相关硬件驱动提取
  • 软件工程期末大复习(六)面向对象分析
  • Spring boot 项目 Spring 注入 代理 并支持 代理对象使用 @Autowired 去调用其他服务
  • javascript 绘制图表的几种方式
  • 解决iNodeClient客户端出现查询SSL VPN网关参数失败的问题
  • springboot573学院个人信息管理系统(论文+源码)_kaic
  • WebRtc01:课程导学、框架介绍
  • 为LLM加速:博查搜索API助力下一代AI应用开发
  • 【优选算法】查找总价格为目标值的两个商品
  • Problem - Contest
  • 在Vue项目中使用Element UI实现一个树形功能,可以通过el-tree组件来实现,树的节点内容从配置文件中读取。
  • HarmonyOS开发:关于帧动画使用分享
  • 群晖上安装Tomcat运行环境
  • 内蒙古水系详细很全shp格式arcgis软件无偏移坐标下载后内容测评
  • [python3]Excel解析库-xlwings
  • 捡鹅卵石C++
  • 走进深圳华为总部参观研学
  • 【AI日记】25.01.05 kaggle 比赛 3-4 | 周反思
  • Android NDK开发实战之环境搭建篇(so库,Gemini ai)