CodeGym /课程 /C# SELF /高级字符串插值

高级字符串插值

C# SELF
第 9 级, 课程 2
可用

1. 回顾字符串插值

我们经常不只是想输出一串文本,还想把变量的值塞进去。以前一般用拼接(+),或者用 string.Format 方法。但自从C#有了神奇的 字符串插值(string interpolation),生活就变得美滋滋了。

字符串插值怎么用

在字符串前面加个 $,然后在字符串里用大括号 {} 来插变量,甚至整个表达式都行。

老方法和新方法插变量的对比

string name = "安娜";
int age = 24;

Console.WriteLine("我叫 " + name + ", 我 " + age + " 岁。"); // 老方法
Console.WriteLine($"我叫 {name}, 我 {age} 岁。"); // 新方法!

你还可以直接插入计算和表达式:


int a = 5, b = 10;
Console.WriteLine($"和 {a} + {b} = {a + b}");

2. 字符串插值的工作原理

在字符串前加 $,变量或表达式用大括号 {} 包起来:


string name = "安娜";
int age = 24;

Console.WriteLine($"我叫 {name}, 我 {age} 岁。");
  • 所有括号外的内容就是普通文本。
  • 所有括号内的内容会被当作C#代码:可以是变量名、算术、方法调用等等。

字符串里直接写表达式和计算

插值不只是变量!还能这样玩:

算术表达式
int apples = 7;
int pears = 5;
Console.WriteLine($"我一共有 {apples + pears} 个水果。"); // 12
字符串操作和方法
string city = "布达佩斯";
Console.WriteLine($"城市大写:{city.ToUpper()}"); // 布达佩斯
三元运算符和条件判断
int score = 90;
Console.WriteLine($"成绩:{(score >= 60 ? "及格" : "不及格")}");
方法调用
string FormatUser(string name, int age) => $"{name} ({age})";
Console.WriteLine($"用户:{FormatUser("伊娃", 19)}"); // 用户:伊娃 (19)
数组和集合的操作
int[] numbers = { 3, 5, 7 };
Console.WriteLine($"总和:{numbers.Sum()}");
Console.WriteLine($"元素:{string.Join(", ", numbers)}");
嵌套表达式和复杂结构
var user = new { Name = "奥列格", Role = "Admin" };
Console.WriteLine($"名字:{user.Name}, 角色:{(user.Role == "Admin" ? "管理员" : "用户")}");
注意:

括号里的表达式最好短一点、易读。如果逻辑太复杂,建议提前算好,直接插变量。

多层表达式
var student = new { Name = "萨沙", Info = new { Age = 21, Uni = "Harvard" } };
Console.WriteLine($"名字:{student.Name}, 学校:{student.Info.Uni}");
即时类型转换
double price = 19.99;
int count = 3;
Console.WriteLine($"总价:{price * count} 欧元");
日期和时间直接格式化
DateTime now = DateTime.Now;
Console.WriteLine($"今天:{now.Day}.{now.Month}.{now.Year}");
循环里的例子
var days = new[] { "周一", "周二", "周三" };
Console.WriteLine($"一周的天:{string.Join(", ", days)}");

3. 插值里的格式化

有时候数字、日期、货币、百分比啥的,显示好看点很重要。
插值可以直接在大括号里加格式——冒号后面写。

基本语法: {表达式:格式}

数字格式化

double num = 1234.5678;
Console.WriteLine($"四舍五入:{num:F2}");     // 1234.57
Console.WriteLine($"科学计数法:{num:E1}"); // 1.2E+003
Console.WriteLine($"千分位:{num:N}"); // 1 234,57(跟文化有关)

常用格式:

  • F2 — 小数点后2位
  • N0 — 千分位,0位小数
  • E1 — 科学计数法,小数点后1位
  • P0 — 百分比,0位小数
double ratio = 0.1234;
Console.WriteLine($"百分比:{ratio:P1}"); // 12,3 %

日期格式化

DateTime d = new DateTime(2025, 6, 18, 15, 42, 0);
Console.WriteLine($"日期:{d:dd.MM.yyyy}");         // 18.06.2025
Console.WriteLine($"时间:{d:HH:mm}");             // 15:42
Console.WriteLine($"ISO:{d:yyyy-MM-ddTHH:mm:ss}"); // 2025-06-18T15:42:00

日期格式小结:

  • dd — 日(2位)
  • MM — 月
  • yyyy — 年
  • HH:mm — 时:分(24小时制)
  • d — 短日期(按文化)
  • D — 长日期

货币和金额格式化

decimal cost = 2999.5m;
Console.WriteLine($"价格:{cost:C}"); // 2,999.50 $  (跟文化有关)

对齐和填充

可以设置字段宽度,左对齐或右对齐:

int val = 7;
Console.WriteLine($"[{val,5}]");  // [    7] — 右对齐
Console.WriteLine($"[{val,-5}]"); // [7    ] — 左对齐

格式组合

DateTime dt = DateTime.Now;
Console.WriteLine($"今天 {dt:dddd, dd MMMM yyyy}, 时间 {dt:HH:mm}");

不同数据类型的插值

bool ok = true;
Console.WriteLine($"操作{(ok ? "成功" : "失败")}");

多行字符串插值

现在还支持 raw string literals 和多行插值字符串:

string user = "提穆尔";
int score = 100;

Console.WriteLine($"""
    恭喜,{user}!
    你的分数:{score}
    """);

嵌套插值和计算

可以调用方法,格式化结果再插进字符串:

double[] temps = { 23.4, 25.1, 21.9 };
Console.WriteLine($"平均温度:{temps.Average():F1}°C");

表格例子(对齐+格式)

用插值在表格里格式化和对齐

double[] prices = { 123.4, 8.9, 5643.0 };
for (int i = 0; i < prices.Length; i++)
    Console.WriteLine($"商品 {i + 1}: {prices[i],10:F2} 欧元");

结果:

商品 1:    123.40 欧元
商品 2:      8.90 欧元
商品 3:   5643.00 欧元

4. 转义和插值一起用

你可以同时用转义字符和插值:

string user = "玛莎";
Console.WriteLine($"你好, \"{user}\"!\n很高兴认识你。");

输出:

你好, "玛莎"!
很高兴认识你。

如果要和逐字字符串一起用,先写 $,再写 @(其实顺序无所谓):

string path = "C:\\Temp";
Console.WriteLine($@"找到文件路径:""{path}""");
2
任务
C# SELF, 第 9 级, 课程 2
已锁定
在字符串插值中格式化数字和日期。
在字符串插值中格式化数字和日期。
2
任务
C# SELF, 第 9 级, 课程 2
已锁定
带对齐和格式化的数据表。
带对齐和格式化的数据表。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION