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}""");
GO TO FULL VERSION