C# $字符串插值的使用

2025-07-27 20:50

本文主要是介绍C# $字符串插值的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧...

$ 字符

字符串插值(String Interpolation)有许多的实现方式,其中使用 $ 字符在现代 C# 中时比较推荐的方式,它提供类似于 String.Format 的效果。

实际根据 $ 使用场景的不同,编译器会选择用不同的方式实现字符串插值,String.Format 只是其中一种,具体见 实现细节

如下分别为使用 $String.Format的示例:

int value = 3;
Debug.Log($"Value is {value}");
Debug.Log(String.Format("Value is {0}", value));

输出结果为:

Value is 3
Value is 3

使用方式

创建内插字符串

字符串插值(String Interpolation) 是用来将表达式插入到字符串中的方式,简单的示例如下所示:

string name = "wxj";
Debug.Log($"Hello,{name}.");

输出结果为:

Hello,wxj.

其中 $"Hello,{name}.") 被称为 内插字符串表达式(interpolated string expression)(下简称 内插表达式),最后输出的 Hello,wxj. 被称为 结果字符串(result string)

由上例可以看出字符串插值的两个必要因素:

  1. 在字符串前需要有 $ 字符标记,且该字符与后续的 " 间不能有空格。
  2. 在内插表达式内部可以有一个或多个 {} ,其中包含着任何返回结果的 C# 表达式,表达式的返回值也可以为 null。

包含不同的数据类型

对于内插表达式中的各 C# 表达式可以是任何类型的,如下所示:

var item = (Name: "eggplant", Price: 1.99m, perPackage: 3);
var date = DateTime.Now;
Debug.Log($"On {date}, the price of {item.Name} was {item.Price} per {item.perPackage} items.");

输出结果为:

On 12/10/2021 8:26:07 AM, the price of eggplant was 1.99 per 3 items.

可以看到该内插字符串表达式中包含有各种类型的表达式(stringDecimalintDeltaTime),在最终的结果中都被正确的解析。

内插字符串表达式,各表达式都会被转换为 string,且规则如下:

  1. 如果表达式结果为 null ,将其转换为空字符串。
  2. 如果表达式结果不为 null,对其调用 ToString 函数。

控制内插表达式的格式

在内插表达式中,还可以控制各表达式转换到 string 时的格式,如下所示:China编程

DateTime date = DateTime.Now;
float value = 1.12345678f;
Debug.Log($"On {date}, value is {value}");
Debug.Log($"On {date:d}, value is {value:f3}");

输出结果为:

On 12/10/2021 8:39:56 AM, value is 1.123457
On 12/10/2021, value is 1.123

在内插表达式中的各表达式中可以通过 : 后加控制的字符格式化输出。如上例中的 df3 即为控制字符。

: 后的控制字符,相当于在调用 ToString 时作为形参控制表达式的输出。
上述表达式等同于:

Debug.Log("On " + date.ToString("d") + ", value is " + value.ToString("f3"));

控制内插表达式的对齐方式

在内插表达式中的个表达式中可以通过 , 后加数字来控制字符宽度和对其方式,如下所示:

var inventory = new Dictionary<string, int>()
{
    ["hammer, ball pein"] = 14,
    ["hammer, ball pein a"] = 18,
    ["hammer, cross pein"] = 5,
    ["screwdriver, Phillips #2"] = 14
};

string result = $"|{"Item",-25}|{"Quantity",10}|\n";
foreach (var item in inventory)
    result += $"|{item.Key,-25}|{item.Value,编程China编程10}|\n";

Debug.Log(result);

输出结果为:

|Item                     |  Quantity|
|hammer, ball pein        |        14|
|hammer, ball pein a      |        18|
|hammer, cross pein       |         5|
|screwdriver, Phillips #2 |        14|

其中逗号后的数字,如果为负数,则输出为左对齐,如果为正数则右对齐。数字本身表示最少的字符数。因此如果显示系统中每个字符的宽度是不相等的话,如 ia 的宽度在某些显示系统下会有较大差异,则即使控制字符宽度也无法实现对其的效果。

如下为相同输出结果在 Unity 的 Console 面板中的展示:

C# $字符串插值的使用

表达式格式和对齐方式也可以一起设定,但需要首先设定对其方式,再设定格式。如下首先控制了左对齐,且字符数为 10 个,又设定输出格式为当前小时数:

Debug.Log($"[{DateTime.Now,-10:HH}]");

结果为:

[10        ]

内插表达式中使用转义序列

如果要在内插表达式中可以使用转义序列,当需要多次使用转义序列时也可使用 原义标识符@ 替代。

如下所示,分别使用使用了转义序列和原文标识符:

string userName = "wxj";
string stringWithEscapes = $"C:\\Users\\{userName}\\Documents";
string verBATimInteChina编程rpolated = $@"C:\Users\{userName}\Documents";
Debug.Log(stringWithEscapes);
Debug.Log(verbatimInterpolated);

输出结果为:

C:\Users\wxj\Documents
C:\Users\wxj\Documents

C# 8.0 后,$ 与 @ 的先后顺序不会造成任何影响。在早期版本中,必须先写 $ 再写 @。

在内插表达式中,如果需要输入 {,则按如下方式处理:

int[] values = new int[] { 1, 2 };
Debug.Log($"Value is {{{values[0]}, {values[1]}}}");

输出结果为:

Value is {1, 2}

也可以通过 $@ 的结合控制换行,如下:

var publishDate = new DateTime(2017, 12, 14);
string str = $@"This post published on {publishDate:yyyy-MM-dd} is about
interpolated strings.";
Debug.Log(str);

此时输出为:

This post published on 2017-12-14 is about
interpolated strings.

内插表达式中使用 ?: 运算符

因为 : 在内插表达式中用来指定格式,因此当使用 ?: 运算符时,必须定义在括号内。如下所示:

System.Random random = new System.Random();
for (int i = 0; i != 3; ++i)
{
    Debug.Log($"Value is {(random.Next() % 2 == 1 ? "Odd" : "Even")}");
}

输出结果为:

Even
Odd
Odd

实现细节

根据 $ 的实现方式的不同,编译器会选择用不同的方式实现字符串插值。

string.Concat

当插值的对象为类型为 string 时,编译器会选择使用 string.Concat

如下代码:

string name = "meziantou";
string hello = $"Hello {name}!";

编译器会将其转换为:

string name = "meziantou";
string hello = string.Concat("Hello ", name, "!");

string.Format

如果插值的对象为类型为非 string 时,编译器会选择使用 string.Format

如下代码:

DateTime now = DateTime.Now;
string str = $"It is {now}";

编译器会将其转换为:

DateTime now = DateTime.Now;
stjavascriptring str = string.Format("It is {0}", now);

FormattableString

如果插值的对象为类型为 Formattable String 时,编译器会选择使用 FormattableStringFactory.Create 创建一个新的 FormattableString

如下代码:

object value1 = "Foo";
object value2 = "Bar";
FormattableString str = $"Test {value1} {value2}";

编译器会将其转换为:

object valuephp1 = "Foo";
object value2 = "Bar";
FormattableString str = FormattableStringFactory.Create("Test {0} {1}", new object[] { value1, value2 });

当真正需要使用该 string 时,会调用 FormattableString.ToString 方法,将其转换为 string。

constants(C# 10)

在 C# 10 中,支持将内插表达式的结果作为常量。如下所示:

const string Username = "meziantou";
const string Hello = $"Hello {Username}!";

// In previous C# version, you need to use the following concat syntax
const string Hello2 = "Hello " + Username + "!";

Interpolated string handlers(C# 10)

C# 10 中针对高性能场景,引入了 InterpolatedStringHandlerArgument,具体见:
String Interpolation in C# 10 and .NET 6 - .NET Blog (microsoft.com)

Reference

$ - string interpolation - C# reference | Microsoft Docs

String interpolation - C# tutorial | Microsoft Docs

String interpolation in C# | Microsoft Docs

Interpolated strings: advanced usages - Meziantou’s blog

到此这篇关于C# $字符串插值的使用的文章就介绍到这了,更多相关C# $字符串插值内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于C# $字符串插值的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155502

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash